简体   繁体   English

如何在java swing中对jComboBox元素进行排序?

[英]How to sort the jComboBox elements in java swing?

How to sort the jComboBox elements list into sorted list. 如何将jComboBox元素列表排序为排序列表。

JComboBox box=new JComboBox();
box.addItem("abc");
box.addItem("zzz");
box.addItem("ccc");
add(box);

i used many jComboBox Components but it's not working. 我使用了很多jComboBox组件,但它不起作用。 How to sort this list into ascending order? 如何将此列表按升序排序?

You can have a look at the SortedComboBoxModel . 您可以查看SortedComboBoxModel

This model extends the DefaultComboBoxModel and has two additional pieces of functionality built into it: 此模型扩展了DefaultComboBoxModel,并在其中内置了两个额外的功能:

  • upon creation of the model, the supplied data will be sorted before 在创建模型时,提供的数据将在之前进行排序
  • the data is added to the model when adding new items to the model, the items will be inserted so as to maintain the sort order 在向模型添加新项目时将数据添加到模型中,将插入项目以维护排序顺序

The default sort order will be the natural sort order of the items added to the model. 默认排序顺序是添加到模型中的项目的自然排序顺序。 However, you can control this by specifying a custom Comparator as a parameter of the constructor. 但是,您可以通过将自定义Comparator指定为构造函数的参数来控制此操作。

Here's an example how to use it (taken from there ): 这是一个如何使用它的例子(取自那里 ):

String[] items = { "one", "two", "three" };
SortedComboBoxModel<String> model = new SortedComboBoxModel<String>(items);
JComboBox<String> comboBox = new JComboBox<String>(model);
comboBox.addItem("four");
comboBox.addItem("five");
comboBox.setSelectedItem("one");

Source code 源代码

You can override the default behavior of addItem to suit your needs. 您可以覆盖addItem的默认行为以满足您的需要。

Runnable Example 可运行的例子

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<String> items = new ArrayList<String>();
                        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);
            }
        });
    }
}

The SortedComboBoxModel link from Alexis C. does not appear to work anymore, although the source link still works. 虽然源链接仍然有效,但Alexis C.的SortedComboBoxModel链接似乎不再起作用了。

Nonetheless, I created a SortedComboBoxModel for classes that implement Comparable (based on this example ). 尽管如此,我为实现Comparable的类创建了一个SortedComboBoxModel(基于此示例 )。

public class SortedComboBoxModel<E extends Comparable<? super E>> extends DefaultComboBoxModel<E> {

    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<E> 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);
    }
}

This can be used like so: 这可以这样使用:

public static void main(String[] args) {
    javax.swing.JComboBox<String> 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));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM