2010-09-27 9 views
8

Ho una JList e voglio che l'utente sia in grado di riordinare gli elementi nell'elenco usando il drag-n-drop (usando il mio ListModel e ListCellRenderer, se questo fa qualche differenza). Quali oggetti devo creare e come posso elaborare l'azione?Come abilitare il trascinamento all'interno di JList

risposta

1

Che ne dite di qualcosa di simile:

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 gen Taccis risposta:

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

Nel seguente metodo v'è un errore logico in essa, perché non appena il pulsante del mouse viene rilasciato, il trascinamento deve essere fermato. In linguaggio semplice, la condizione IF deve essere negata semplicemente

@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; 
    } 
Problemi correlati