如何在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)); } }