J'ai une jlist et je souhaite que l'utilisateur puisse réorganiser les éléments de la liste à l'aide de Glisser-N-Drop (à l'aide de ma propre liste ListModel et ListCellrenderer, si cela fait toute différence). Quels objets dois-je créer et comment traiter l'action? P>
3 Réponses :
Que diriez-vous de quelque chose comme ceci:
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; }
Modifié Jan Tacce Réponse:
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(); } }
Dans la méthode suivante, il existe une erreur logique car dès que le bouton de la souris est libéré, le glisser doit être arrêté. En langage clair, la condition IF doit être annulée simplement