8
votes

Comment activer la fonction glisser-déposer à l'intérieur JList

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?


0 commentaires

3 Réponses :


1
votes

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;
}


0 commentaires

5
votes

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();
    }
}


0 commentaires

0
votes

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 xxx


0 commentaires