2011-04-05 128 views
4

我有以下演示应用程序显示值的列表,但我需要能够 来控制列表中元素的排序。添加这个最简单的方法是什么?JList按字母顺序排列

package demo; 

import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.ListModel; 

public class JListOrder { 

    public JListOrder() 
    { 
     JFrame frame = new JFrame("JListOrder"); 

     DefaultListModel model = new DefaultListModel(); 
     model.addElement("z"); 
     model.addElement("Z"); 
     model.addElement("a"); 
     model.addElement("A"); 
     model.addElement("C"); 
     model.addElement("c"); 
     model.addElement("b"); 
     model.addElement("B"); 

     JList list = new JList(model); 
     frame.add(list); 
     frame.setSize(200,200); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new JListOrder(); 
    } 
} 

回答

7

最简单的方法是使用其中SwingX支持排序/ JXList的滤波相同的方式,核心表的排序/过滤:

JXList list = new JXList(model); 
list.setAutoCreateRowSorter(true); 
list.toggleSortOrder(); 
+1

无需使用单独的库。只需扩展AbstractListModel并使用TreeSet之类的SortedSet来保存元素。这是一个实现:http://www.java2s.com/Tutorial/Java/0240__Swing/SortedListModelsortableJList.htm([archive](https://archive.today/EoFvn))。或者使用我制作的这个快速分支添加泛型:https://gist.github.com/theAprel/bc661668d7120756b4a8 – Aprel 2015-02-07 06:19:57

+0

如果您不在乎选择状态... ;-) – kleopatra 2015-02-07 08:48:40

0

DefaultListModel按照它们添加的顺序显示元素。您可以按顺序添加元素,这就是它们的显示方式。

3

如果您的意思是,您需要在运行时控制其元素的顺序,而其项目正在改变,那么您可能需要为您的JList实现自己的SortedListModel。来自oracle的一篇不错的文章可以在here找到。

+1

可能被认为是一篇不错的文章 - 但它的工作并不可靠:与往常一样使用这种装饰器方法(并且JList不知道事实),很难获得正确的通知。在选择更改时做任何事情时尤其棘手:在排序的模型处理数据事件时,索引转换可能无效。 – kleopatra 2011-04-05 15:25:43

2

如果您不希望在将对象添加到JList之前排序对象,那么您可以编写/使用ListModel实现,以保持它们已经为您排序。见例如this implementation

正如我在几乎所有与JLists/JTables有关的问题中所说的,请查看GlazedLists。它几乎涵盖了所有可以想象的排序和筛选方面。

0

可以使用Sorted Combo Box Model。我知道是说“组合框”,但它也实现了List接口。

+1

严格来说,这违反了MutableComboBoxModel合约〜 insertElementAt(value,index)〜 - 我将其解释为〜assertEquals(value,model.getElementAt(index))〜(hmm ..任何方式来格式化代码片段的评论? – kleopatra 2011-04-05 17:31:59