如何在JList中启用拖放

Dur*_*dal 8 java swing drag-and-drop

我有一个JList,并希望用户能够使用drag-n-drop重新排序列表中的元素(使用我自己的ListModel和ListCellRenderer,如果这有任何区别).我需要创建哪些对象,以及如何处理该操作?

Gra*_*ins 5

修改Jan Taccis回答:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Jan*_*cci 1

像这样的事情怎么样:

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;
}
Run Code Online (Sandbox Code Playgroud)