Как включить перетаскивание внутри JList - PullRequest
8 голосов
/ 27 сентября 2010

У меня есть JList и я хочу, чтобы пользователь мог переупорядочивать элементы в списке, используя drag-n-drop (используя мои собственные ListModel и ListCellRenderer, если это имеет какое-либо значение). Какие объекты мне нужно создать, и как мне обработать действие?

Ответы [ 3 ]

5 голосов
/ 14 ноября 2013

Модифицированный ответ 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 голос
/ 31 августа 2013

Как насчет этого:

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 голосов
/ 09 июня 2016

В следующем методе есть логическая ошибка, потому что как только кнопка мыши отпущена, перетаскивание должно быть остановлено.На простом языке условие 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...