2012-04-06 60 views
4

我正在做一个基于swing的应用程序,其中有一个JList,它定期获取相同数据的不同顺序更新,不常更新新项目,并且不常更新少项目。我试图找出最佳的方式,使这看起来不错。现在,我只是打电话对JList进行流畅重新排序的“最佳”方法是什么?

JList.setListData(String [] data); 

这看起来不太好,它会清除选定的项目。

我想要一种方法来更新它,只有清除选中的项目,如果它从列表中删除,但保持相同的项目被选中,即使它们的索引更改。我正在考虑跟踪哪些索引被选中,然后在更改数据后设置所选项目,但听起来很可怕。我还查看了ListModels并跟踪了我自己的内容,但似乎选择了哪些项目保存在JList本身中,以至于无法完美地工作。

我真的很感激任何建议。

+0

'setListData()'的实现是否相关? [sscce](http://sscce.org/),例如[this one](http://stackoverflow.com/a/10048030/230513)可能会有所帮助。 – trashgod 2012-04-06 19:16:25

+0

使用支持ui级别排序/过滤的JXList(Swingx的一部分)。请注意,所有模型装饰解决方案在通知批量修改时都是无效的(我们通常可以将其作为更常见的查询粒度单项:-) – kleopatra 2012-04-07 09:33:03

回答

4

我给你做工作的例子。

我已经使用了JList像你所要求的那样,添加了从列表中添加和删除的按钮。

无论如何,希望这有助于!

干杯。

public class Test { 

    private static String selectedValue = null; 
    private static JList jList = new JList(); 

    public static void main(String args[]) { 
     JFrame jFrame = new JFrame(); 
     jFrame.setSize(500, 500); 
     jFrame.setLocationRelativeTo(null); 
     jFrame.setLayout(new GridLayout(4, 1)); 

     jList = new JList(new String[]{"1", "2", "3", "4", "5"}); 
     jFrame.add(jList); 

     JButton rearrangeButton = new JButton("rearrange"); 
     rearrangeButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(rearrangeButton); 

     JButton addButton = new JButton("add"); 
     addButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(addButton); 

     JButton deleteButton = new JButton("delete"); 
     deleteButton.addActionListener(new Test().new SelectedListener()); 
     jFrame.add(deleteButton); 

     jFrame.setVisible(true); 
    } 

    private class SelectedListener implements ActionListener { 

     public void actionPerformed(ActionEvent actionEvent) { 
      storeSelected(); 

      if (actionEvent.getActionCommand().equalsIgnoreCase("rearrange")) { 
       jList.setListData(new String[]{"5", "4", "3", "2", "1"}); 
      } else if (actionEvent.getActionCommand().equalsIgnoreCase("add")) { 
       List< String> items = new ArrayList< String>(); 

       for (int item = 0; item < jList.getModel().getSize(); item++) { 
        items.add(jList.getModel().getElementAt(item).toString()); 
       } 

       items.add("new"); 

       jList.setListData(items.toArray()); 
      } else if (actionEvent.getActionCommand().equalsIgnoreCase("delete")) { 
       List< String> items = new ArrayList< String>(); 

       for (int item = 0; item < jList.getModel().getSize(); item++) { 
        items.add(jList.getModel().getElementAt(item).toString()); 
       } 

       items.remove(0); 

       jList.setListData(items.toArray()); 
      } 

      reSelect(); 
     } 
    } 

    private static void storeSelected() { 
     if (jList.getSelectedIndex() > -1) { 
      selectedValue = jList.getSelectedValue().toString(); 
     } else { 
      selectedValue = null; 
     } 
    } 

    private static void reSelect() { 
     if (selectedValue != null) { 
      jList.setSelectedValue(selectedValue, true); 
     } 
    } 
} 
+0

[sscce] +1(http://sscce.org/)。你将如何处理多个选择?编辑:对大括号抱歉。 :-) – trashgod 2012-04-06 19:15:48

+0

这看起来很棒,我会研究它,并给它一个旋转 – Nico 2012-04-07 02:44:31

+0

我通过编辑storeSelected()来处理多个选择来保存值的数组(JList.getSelectedValues()),然后在重新选择,我计算每个这些值的索引,然后使用setSelectedIndices(int [] indices)将它们全部设置。这不是最干净的,但它的工作原理。谢谢您的帮助!!! – Nico 2012-04-07 07:11:54

4

看来标准的JList有没有方法来调整排序(你到底为什么他们只补充说,到JTable ...),但有一个tutorial for sorted lists

+0

+1好文章;也考虑一个列上的JTable。 – trashgod 2012-04-06 19:14:04

+0

这是一篇很好的文章,它看起来像是正确的做法。 – Nico 2012-04-07 07:12:33

+0

与模型装饰方法一样的问题:在批量更改的通知期间,排序模型状态是未定义的... – kleopatra 2012-04-07 09:35:52

相关问题