# Java Applet JTable/JList



## Melwin87 (15. Jan 2010)

Hallo Leute,..
Bin ganz neu in Java und such ne Möglichkeit drei Spalten mit jeweils 4 Bildern
per Drag&Drop zu sortieren und am Ende die Reihenfolge auszuwerten.

Kann mir da jemand irgendwie Anhaltspunkte geben wie ich das am Besten realisieren kann ? Dürfte ja eigentlich nicht wirklich schwer sein.

Gerade habe ich das Problem das ich einfach keine 4 JLists nebeneinander bekomme.


----------



## Marco13 (15. Jan 2010)

4 Lists nebeneinander ...

```
somePanel.setLayout(new GridLayout(1,4));
somePanel.add(list[0]);
somePanel.add(list[1]);
somePanel.add(list[2]);
somePanel.add(list[3]);
```
... aber wenn's daran hakt, wirst du mit Drag&Drop deinen Spaß haben  (Das kann ein bißchen Frickelig sein, aber es gibt zumindest viele Beispiele im Netz, die man klau^C^C^C an denen man sich orientieren kann)


----------



## Melwin87 (27. Jan 2010)

So.. das hat schonmal funktioniert.
Ich habe jetzt eine JList Erweiterung damit ich Bilder darin anzeigen kann: (das funktioniert)

```
public class JListWithImages extends JList {

 public JListWithImages() {
   setCellRenderer(new CustomCellRenderer());
   }

 class CustomCellRenderer implements ListCellRenderer {
   public Component getListCellRendererComponent
    (JList list, Object value, int index,
     boolean isSelected,boolean cellHasFocus) {
     Component component = (Component)value;
     component.setBackground
      (isSelected ? Color.black : Color.white);
     component.setForeground
      (isSelected ? Color.white : Color.black);
     return component;
     }
   }
}
```

Das Ganze habe ich jetzt so eingebaut:

```
JFrame frame = new JFrame();
	    JPanel panel = new JPanel();
	    Vector vector = new Vector();

	    JPanel jp1 = new JPanel();
	    jp1.add(new JLabel(new ImageIcon("eins.gif")));
	    JPanel jp2 = new JPanel();
	    jp2.add(new JLabel(new ImageIcon("zwei.gif")));
	    JPanel jp3 = new JPanel();
	    jp3.add(new JLabel(new ImageIcon("drei.gif")));
	    JPanel jp4 = new JPanel();
	    jp4.add(new JLabel(new ImageIcon("vier.gif")));
	    
	    vector.addElement(jp1);
	    vector.addElement(jp2);
	    vector.addElement(jp3);
	    vector.addElement(jp4);
	    
	    JListWithImages jlwi = new JListWithImages();
	    jlwi.setListData(vector);
	    
	    // Drag&Drop aktivieren
	    ListTransferHandler lh = new ListTransferHandler();
        jlwi.setTransferHandler(lh);
	    jlwi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
	    jlwi.setDragEnabled(true);
	    jlwi.setDropMode(DropMode.INSERT);
```


Mit diesem Transferhandler: 
http://java.sun.com/docs/books/tuto...PasteProject/src/dnd/ListTransferHandler.java

bekomme ich aber wegen der Bilder folgende Fehlermeldungen:
(Wenn ich eine normale JList ohne Bilder nehme, funktioniert das wunderbar)


```
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-1" java.lang.ClassCastException: javax.swing.JPanel cannot be cast to java.lang.String
at ListTransferHandler.createTransferable(ListTransferHandler.java:100)
```

Ich hoffe jemand kann mir da weiterhelfen

Danke


----------



## Michael... (27. Jan 2010)

Hab zwar noch nie was mit D&D gemacht, aber damit Objekte per D&D übergeben werden können müssen diese das Interface Transferable implementieren
--> Du musst eigene Objekte verwenden und die in die Liste stecken JLabel bzw. JPanel implementieren meines Wissen das Interface nicht.

Dann müsstest Du in der ListTransferHandler.java folgende Methode auf Deine Objekte mappen, diese funktioniert nur mit Strings:

```
protected Transferable createTransferable(JComponent c) {
        JList list = (JList)c;
        int index = list.getSelectedIndex();
        String value = (String)list.getSelectedValue();
        return new StringSelection(value);
    }
```


----------



## Marco13 (27. Jan 2010)

Ja, der verlinkte TransferHandler unterstützt eben nur Strings. Sich einen für JPanels selbst schreiben könnte eben wie angedeutet etwas... fummelig werden (außer wenn man weiß, wie's geht...)


----------



## Melwin87 (27. Jan 2010)

Oh nein... gibt es sowas schon vorgefertigt ? Oder kann jemand helfen ?


----------



## Marco13 (27. Jan 2010)

Introduction to DnD (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer) lesen, an Beispielen nachvollziehen, ausprobieren... ist mühsam...

Das hier ist jedenfalls so übel zusammengestümpert, dass ich selbst das NICHT verwenden würde. Aber ich hab' gerade nich viel Zeit, und vielleicht hast du ja keine ... (hohen? Nein: GAR keine) Ansprüche.



```
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

class PanelDragDrop
{
    public static void main(String args[])
    {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        DefaultListModel model = new DefaultListModel();

        JPanel jp1 = new JPanel();
        jp1.add(new JLabel(new ImageIcon("image00.png")));
        JPanel jp2 = new JPanel();
        jp2.add(new JLabel(new ImageIcon("image01.png")));
        JPanel jp3 = new JPanel();
        jp3.add(new JLabel(new ImageIcon("image02.png")));
        JPanel jp4 = new JPanel();
        jp4.add(new JLabel(new ImageIcon("image03.png")));

        model.addElement(jp1);
        model.addElement(jp2);
        model.addElement(jp3);
        model.addElement(jp4);
        JListWithImages jlwi = new JListWithImages(model);

        // Drag&Drop aktivieren
        ListTransferHandler lh = new ListTransferHandler();
        jlwi.setTransferHandler(lh);
        jlwi.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jlwi.setDragEnabled(true);
        jlwi.setDropMode(DropMode.INSERT);


        lh = new ListTransferHandler();
        jp4 = new JPanel();
        jp4.add(new JLabel(new ImageIcon("image03.png")));
        model = new DefaultListModel();
        model.addElement(jp4);
        JListWithImages jlwi2 = new JListWithImages(model);

        jlwi2.setTransferHandler(lh);
        jlwi2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jlwi2.setDragEnabled(true);
        jlwi2.setDropMode(DropMode.ON_OR_INSERT);


        panel.setLayout(new GridLayout(1,0));
        panel.add(jlwi);
        panel.add(jlwi2);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }
}

class JListWithImages extends JList {

 public JListWithImages(ListModel model)
 {
     super(model);
   setCellRenderer(new CustomCellRenderer());
   }

 class CustomCellRenderer implements ListCellRenderer {
   public Component getListCellRendererComponent
    (JList list, Object value, int index,
     boolean isSelected,boolean cellHasFocus) {
     Component component = (Component)value;
     component.setBackground
      (isSelected ? Color.black : Color.white);
     component.setForeground
      (isSelected ? Color.white : Color.black);
     return component;
     }
   }
}


class ObjectTransferable implements Transferable
{
    public static DataFlavor flavor = new DataFlavor(Object.class, "Object");
    private Object object;

    public ObjectTransferable(Object object)
    {
        this.object = object;
    }

    public Object getTransferData(DataFlavor flavor)
    {
        return object;
    }

    public DataFlavor[] getTransferDataFlavors()
    {
        return new DataFlavor[]{flavor};
    }

    public boolean isDataFlavorSupported(DataFlavor flavor)
    {
        return true;
    }
}

class ListTransferHandler extends TransferHandler {

    /**
     * Perform the actual data import.
     */
    public boolean importData(TransferHandler.TransferSupport info) {
        Object data = null;

        //If we can't handle the import, bail now.
        if (!canImport(info)) {
            return false;
        }

        JList list = null;
        DefaultListModel model = null;
        try
        {
            list = (JList)info.getComponent();
            model = (DefaultListModel)(list.getModel());
        } catch (Exception ioe) {
            ioe.printStackTrace();
            return false;
        }

        //Fetch the data -- bail if this fails
        try {
            data = info.getTransferable().getTransferData(ObjectTransferable.flavor);
        } catch (UnsupportedFlavorException ufe) {
            System.out.println("importData: unsupported data flavor");
            return false;
        } catch (IOException ioe) {
            System.out.println("importData: I/O exception");
            return false;
        } catch (Exception ioe) {
            ioe.printStackTrace();
            return false;
        }

        if (info.isDrop()) { //This is a drop
            JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
            int index = dl.getIndex();
            if (dl.isInsert()) {
                model.add(index, data);
                return true;
            } else {
                model.set(index, data);
                return true;
            }
        } else { //This is a paste
            int index = list.getSelectedIndex();
            // if there is a valid selection,
            // insert data after the selection
            if (index >= 0) {
                model.add(list.getSelectedIndex()+1, data);
            // else append to the end of the list
            } else {
                model.addElement(data);
            }
            return true;
        }
    }

    /**
     * Bundle up the data for export.
     */
    protected Transferable createTransferable(JComponent c) {
        JList list = (JList)c;
        int index = list.getSelectedIndex();
        Object value = list.getSelectedValue();
        return new ObjectTransferable(value);
    }

    /**
     * The list handles both copy and move actions.
     */
    public int getSourceActions(JComponent c) {
        return TransferHandler.COPY_OR_MOVE;
    }



    /**
     * When the export is complete, remove the old list entry if the
     * action was a move.
     */
    protected void exportDone(JComponent c, Transferable data, int action) {
        if (action != MOVE) {
            return;
        }
        JList list = (JList)c;
        DefaultListModel model = (DefaultListModel)list.getModel();
        int index = list.getSelectedIndex();
        model.remove(index);
    }

    /**
     * We only support importing strings.
     */
    public boolean canImport(TransferHandler.TransferSupport support) {
        return true;
    }
}
```


----------

