【问题标题】:How to enable drag-and-drop inside JList如何在 JList 中启用拖放功能
【发布时间】:2011-04-17 18:57:29
【问题描述】:

我有一个 JList,并希望用户能够使用拖放操作重新排序列表中的元素(使用我自己的 ListModel 和 ListCellRenderer,如果这有什么不同的话)。我需要创建哪些对象,以及如何处理操作?

【问题讨论】:

    标签: java swing drag-and-drop


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这样的事情怎么样:

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

      【讨论】:

        【解决方案3】:

        在下面的方法中存在逻辑错误,因为一旦释放鼠标按钮,就必须停止拖动。用简单的语言来说,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;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多