2010-09-27 3 views
8

Ich habe eine JList und möchte den Benutzer in der Lage sein, die Elemente in der Liste mit Drag-n-Drop (mit meinem eigenen ListModel und ListCellRenderer, wenn dies einen Unterschied macht) neu anordnen). Welche Objekte muss ich erstellen und wie verarbeite ich die Aktion?So aktivieren Sie drag-and-drop in JList

Antwort

1

Wie wäre es etwa so:

DefaultListModel<String> myListModel = createStringListModel(); 
JList<String> myList = new JList<String>(myListModel); 
MyMouseAdaptor myMouseAdaptor = new MyMouseAdaptor(); 
myList.addMouseListener(myMouseAdaptor); 
myList.addMouseMotionListener(myMouseAdaptor); 

private class MyMouseAdaptor extends MouseInputAdapter { 
    private boolean mouseDragging = false; 
    private int dragSourceIndex; 

    @Override 
    public void mousePressed(MouseEvent e) { 
     dragSourceIndex = myList.getSelectedIndex(); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (mouseDragging) {   
      int dragTargetIndex = myList.getSelectedIndex(); 
      String dragElement = myListModel.get(dragSourceIndex); 
      myListModel.remove(dragSourceIndex); 
      myListModel.add(dragTargetIndex, dragElement); 
     } 
     mouseDragging = false; 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) {    
     mouseDragging = true; 
    } 
} 

private DefaultListModel<String> createStringListModel() { 
    final String[] listElements = new String[] { "Cat", "Dog", "Cow", "Horse", "Pig", "Monkey" }; 
    DefaultListModel<String> listModel = new DefaultListModel<String>(); 
    for (String element : listElements) { 
     listModel.addElement(element); 
    } 
    return listModel; 
} 
5

Modified Jan Taccis Antwort:

public class DndTest extends JFrame { 

    JList<String> myList; 
    DefaultListModel<String> myListModel; 

    public DndTest() { 
     myListModel = createStringListModel(); 
     myList = new JList<String>(myListModel); 
     MyMouseAdaptor myMouseAdaptor = new MyMouseAdaptor(); 
     myList.addMouseListener(myMouseAdaptor); 
     myList.addMouseMotionListener(myMouseAdaptor); 

     JPanel content = new JPanel(); 
     content.add(myList); 
     this.add(content); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 
    } 

    private class MyMouseAdaptor extends MouseInputAdapter { 
     private boolean mouseDragging = false; 
     private int dragSourceIndex; 

     @Override 
     public void mousePressed(MouseEvent e) { 
      if (SwingUtilities.isLeftMouseButton(e)) { 
       dragSourceIndex = myList.getSelectedIndex(); 
       mouseDragging = true; 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      mouseDragging = false; 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (mouseDragging) { 
       int currentIndex = myList.locationToIndex(e.getPoint()); 
       if (currentIndex != dragSourceIndex) { 
        int dragTargetIndex = myList.getSelectedIndex(); 
        String dragElement = myListModel.get(dragSourceIndex); 
        myListModel.remove(dragSourceIndex); 
        myListModel.add(dragTargetIndex, dragElement); 
        dragSourceIndex = currentIndex; 
       } 
      } 
     } 
    } 

    private DefaultListModel<String> createStringListModel() { 
     final String[] listElements = new String[] { "Cat", "Dog", "Cow", "Horse", "Pig", "Monkey" }; 
     DefaultListModel<String> listModel = new DefaultListModel<String>(); 
     for (String element : listElements) { 
      listModel.addElement(element); 
     } 
     return listModel; 
    } 

    public static void main(String[] args) { 
     new DndTest(); 
    } 
} 
0

Im folgenden Verfahren gibt es einen logischen Fehler in ihm, denn sobald die Maustaste losgelassen wird, Das Ziehen muss gestoppt werden. Im Klartext muss die IF-Bedingung einfach

@Override 
    public void mouseReleased(MouseEvent e) { 
     if (!mouseDragging) {   
      int dragTargetIndex = myList.getSelectedIndex(); 
      String dragElement = myListModel.get(dragSourceIndex); 
      myListModel.remove(dragSourceIndex); 
      myListModel.add(dragTargetIndex, dragElement); 
     } 
     mouseDragging = false; 
    } 
negiert werden
Verwandte Themen