1

我正在尝试开发一个 Java 代码,它将在两个 JList 之间移动选定的数据,因为 getModel() 方法不会返回 DefaultListModel,并且 List.getModel() 方法也不允许显式转换,是否还有其他可能的移动方式从一个到另一个 JList 中选择数据,反之亦然。?

这是我正在尝试的确切视图...(“全部添加”和“全部删除”按钮运行良好,我为此使用 Arralist,但我正在寻找所选数据的解决方案,包括添加的排序顺序和删除数据)

代码:

对于左 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。

谢谢大家的关注。

4

2 回答 2

1

您的解决方案应该非常简单,例如:

  1. 从左侧列表中获取所有选定的项目
  2. 将左侧列表中的选定项目添加到右侧列表

而对于 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);
   }
于 2013-10-07T13:32:02.607 回答
0

这些是您正在寻找的步骤:

  1. 获取A列表中被选中的元素
  2. 从 A 列表中删除元素
  3. 为避免强制转换异常,请获取列表 B 中的所有元素
  4. 将列表 B 中的所有元素添加到新模型
  5. 将从列表 A 中获得的所有元素添加到新模型中
  6. 将新模型设置为列表 B
  7. 感谢创作者:)

这是核心方法:

    /**
     * Moves the {@link Entity entities} from one {@link JList} to another.
     * Used in the filters context of the app, but made generic and reusable.
     * 
     * @param from {@link JList} to obtain the entities from.
     * @param to  {@link  JList} to add the obtained entities.
     * @param <E> Class of the elements loaded in the {@link  JList}.
     * @throws IllegalArgumentException - if any the provided parameters are null.
     */
    public <E> void moveSelectedTo(JList from, JList to) {
        String logID="::moveSelectedTo(from,to): ";
        //log.trace("{}Start", logID);
        //checkNotNull(from,to);
        try{
            List<E> entitiesToTransition=from.getSelectedValuesList();
            if(entitiesToTransition==null || entitiesToTransition.isEmpty()) return;
            
            DefaultListModel fromModel = (DefaultListModel) from.getModel();
            for (E entity: entitiesToTransition) fromModel.removeElement(entity);
            
            
            List<E> previouslyLoadedEntities=new ArrayList<>();
            ListModel<E> model=(to.getModel());
            for (int i = 0; i < model.getSize(); i++)   previouslyLoadedEntities.add(model.getElementAt(i));
            DefaultListModel<E> dlm=new DefaultListModel<>(){{
                addAll(previouslyLoadedEntities);
                addAll(entitiesToTransition);
            }};
            to.setModel(dlm);
            log.trace("{}Finish", logID);
            
        } catch (Exception e) {
            throw new RuntimeException("Impossible to transition the entities from one JList to another ", e);
        }
    }
于 2022-01-19T22:37:14.137 回答