在两个JList之间移动所选数据

时间:2013-10-07 11:13:32

标签: java swing jlist

我正在尝试开发一个Java代码,它将在两个JList之间移动所选数据, 由于getModel()方法不会返回DefaultListModel,并且也不允许显式转换为List.getModel()方法,是否可以将所选数据从一个JList移动​​到另一个JList,反之亦然。?

以下是我正在尝试的精确视图...(“全部添加”和“全部删除”按钮运行良好,我正在使用Arralist,但我找到所选数据的解决方案,包括订购顺序添加和删​​除数据)

代码:

For Left JList“

lmLeft = new DefaultListModel();
lstLeft = new javax.swing.JList();
lstLeft.setModel(lmLeft);

对于正确的JList:

lmRight = new DefaultListModel();
lstRight = new javax.swing.JList();
lstRight.setModel(lmRight);

已解决:我用JTable替换了JList

注意:我们无法将DefaultListModel强制转换为getList(),因为它将返回AbstractListModel。

谢谢大家的关注。

1 个答案:

答案 0 :(得分:1)

您的解决方案应该非常直接,如:

  1. 从左侧列表中获取所有选定的项目
  2. 将选定项目从左侧列表添加到右侧列表
  3. 对于Add All和Remove All来说,这些应该是非常简单的。 JList类为您提供了执行上述所有操作的方法。

    JList.getSelectedIndices()将返回已选择的所有索引的int(int [])数组。因此,您将浏览列表并获取这些索引处的项目并将其添加到右侧列表中。

    List<Object> myItemsForRightList = new ArrayList<Object>();
    int[] selectedIndexes = jListLeft.getSelectedIndicies();
    for(int i=0; i < selectedIndexes.length; i++) {
          Object whatever = jListLeft.getElementAt(selectedIndexes[i]);
          ((DefaultListModel)jListRight.getModel()).addElement(whatever);
    }
    

    我建议您查看API提供的内容@ http://docs.oracle.com/javase/6/docs/api/javax/swing/JList.html

    ---编辑---
    仅仅因为没有提供完整的源代码,我正在重新发布上面的代码,并考虑到JDK 7

    public static void main(String ... args) {
           JFrame frame = new JFrame("Test");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
           DefaultListModel<String> defaultListModel = new DefaultListModel<String>();
           defaultListModel.addElement("Bla bla bla");
           defaultListModel.addElement("Ble ble ble");
           defaultListModel.addElement("Blo blo blo");
    
           final JList<String> list = new JList<String>();
           list.setPreferredSize(new Dimension(400, 200));
           list.setModel(defaultListModel);
    
           JButton button = new JButton("Add");
           button.addActionListener(new ActionListener() {
               @Override
               public void actionPerformed(ActionEvent e) {
                   ((DefaultListModel<String>)list.getModel()).addElement("New one added");
               }
           });
    
           frame.setLayout(new BorderLayout(5, 5));
           frame.add(new JScrollPane(list), BorderLayout.NORTH);
           frame.add(button, BorderLayout.SOUTH);
           frame.pack();
           frame.setVisible(true);
       }