如何在JList中启用拖放功能

时间:2010-09-27 13:42:46

标签: java swing drag-and-drop

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

在以下方法中,存在逻辑错误,因为只要释放鼠标按钮,就必须停止拖动。用简单的语言来说,必须简单地否定IF条件

@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;
    }
相关问题