如何在java swing中对jComboBox元素进行排序?
如何将jComboBox
元素列表排序为排序列表。
JComboBox box=new JComboBox(); box.addItem("abc"); box.addItem("zzz"); box.addItem("ccc"); add(box);
我使用了很多jComboBox组件,但它不起作用。 如何将此列表按升序排序?
您可以查看SortedComboBoxModel
。
此模型扩展了DefaultComboBoxModel,并在其中内置了两个额外的function:
- 在创建模型时,提供的数据将在之前进行排序
- 在向模型添加新项目时将数据添加到模型中,将插入项目以维护排序顺序
默认排序顺序是添加到模型的项目的自然排序顺序。 但是,您可以通过将自定义Comparator指定为构造函数的参数来控制此操作。
这是一个如何使用它的例子(取自那里 ):
String[] items = { "one", "two", "three" }; SortedComboBoxModel model = new SortedComboBoxModel (items); JComboBox comboBox = new JComboBox (model); comboBox.addItem("four"); comboBox.addItem("five"); comboBox.setSelectedItem("one");
源代码
您可以覆盖addItem
的默认行为以满足您的需要。
可运行的例子
public class SortedCombobox { @SuppressWarnings("serial") public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("Overriden JCombobox"); frame.getContentPane().setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JComboBox box = new JComboBox(){ @Override public void addItem(Object obj){ int count = getItemCount(); String toAdd = (String) obj; List items = new ArrayList (); for(int i = 0; i < count; i++){ items.add((String)getItemAt(i)); } if(items.size() == 0){ super.addItem(toAdd); return; }else{ if(toAdd.compareTo(items.get(0)) <= 0){ insertItemAt(toAdd, 0); }else{ int lastIndexOfHigherNum = 0; for(int i = 0; i < count; i++){ if(toAdd.compareTo(items.get(i)) > 0){ lastIndexOfHigherNum = i; } } insertItemAt(toAdd, lastIndexOfHigherNum+1); } } } }; box.addItem("zzz"); box.addItem("hh"); box.addItem("aa"); box.addItem("yy"); box.addItem("uu"); box.addItem("bb"); box.addItem("rr"); box.addItem("aa"); box.setSelectedIndex(0); frame.getContentPane().add(box); frame.pack(); frame.setVisible(true); } }); } }
虽然源链接仍然有效,但Alexis C.的SortedComboBoxModel链接似乎不再起作用了。
尽管如此,我为实现Comparable的类创建了一个SortedComboBoxModel(基于此示例 )。
public class SortedComboBoxModel> extends DefaultComboBoxModel { public SortedComboBoxModel() { super(); } public SortedComboBoxModel(E[] items) { Arrays.sort(items); int size = items.length; for (int i = 0; i < size; i++) { super.addElement(items[i]); } setSelectedItem(items[0]); } public SortedComboBoxModel(Vector items) { Collections.sort(items); int size = items.size(); for (int i = 0; i < size; i++) { super.addElement(items.elementAt(i)); } setSelectedItem(items.elementAt(0)); } @Override public void addElement(E element) { insertElementAt(element, 0); } @Override public void insertElementAt(E element, int index) { int size = getSize(); for (index = 0; index < size; index++) { Comparable c = (Comparable) getElementAt(index); if (c.compareTo(element) > 0) { break; } } super.insertElementAt(element, index); } }
这可以这样使用:
public static void main(String[] args) { javax.swing.JComboBox sortedComboBox = new javax.swing.JComboBox<>(); String[] testArray = new String[]{"DDD", "AAA", "CCC", "BBB"}; sortedComboBox.setModel(new SortedComboBoxModel<>(testArray)); //print out the sorted contents for (int i = 0; i < sortedComboBox.getItemCount(); i++) { System.out.println(i + ": " + sortedComboBox.getItemAt(i)); } }