通过java中的items属性动态排序ComboBox

时间:2014-05-21 16:13:27

标签: java swing sorting dynamic jcombobox

我想根据它的项目attributs对JComboBox的项目进行排序:

我有这堂课:

public class Person {
    private static _ID;
    private _Name;
    private _FamilyName;
    public MyObject (int id, String name, String familyName){
        _ID = id;
        _Name = name;
        _FamilyName = familyName;
    }
 @Override
 public toString (){
    return _Name;
 }

}

我有一个JComboBox:

JComboBox comboBox = new JComboBox();
comboBox.addItem( new Person(1,"Richard","Stallman") );
comboBox.addItem( new Person(2,"Douglas","Adams") );
comboBox.addItem( new Person(3,"Terry","Pratchett") );
comboBox.addItem( new Person(4,"Goreges","Brassens") );

我希望用户选择他想要对JComboBox进行排序的方式:

    JComboBox comboBoxSort = new JComboBox();
    comboBoxSort.addItemSort("ID");
    comboBoxSort.addItemSort("Name");
    comboBoxSort.addItemSort("Family Name");

我不需要更改JComboBox中显示的值,我只需要更改订单。

2 个答案:

答案 0 :(得分:1)

您应该可以使用Sorted Combo Box Model

默认情况下,它会根据添加到模型的对象的自然排序顺序进行排序,或者您可以提供自定义比较器。

答案 1 :(得分:0)

首先,你的Person类在语法上是错误的。这是一个更正版本。

public class Person {
    private static int  _ID_COUNTER = 0;
    private int         _ID;
    private String      _Name;
    private String      _FamilyName;

    public Person(String name, String familyName) {
        _ID  = ++ID_COUNTER;
        _Name = name;
        _FamilyName = familyName;
    }

    @Override
    public String toString() {
        return _Name;
    }

    public int get_ID() {
        return _ID;
    }

    public String get_Name() {
        return _Name;
    }

    public String get_FamilyName() {
        return _FamilyName;
    }

}

camickr提到的Sorted Combo Box模型允许您以一种方式对Person实例进行排序。要以不同的方式对Person实例进行排序,您需要编写3个Comparator类。这是一个名字。

public class NameSort implements Comparator<Person> {
    @Override
    public int compare(Person arg0, Person arg1) {
        int result = arg0.get_Name().compareToIgnoreCase(arg1.get_Name());
        if (result == 0) {
            return arg0.get_FamilyName().compareToIgnoreCase(
                    arg1.get_FamilyName());
        } else {
            return result;
        }
    }
}

您应该能够编写其他2个比较器类。

最后,您需要将输入排序到JComboBox。最简单的方法是保留List&lt; Person&gt;并将已排序的Person []传递给JComboBox。这是一种方法。

    public Person[] sortPersonsByName(List<Person> persons) {
        Collections.sort(persons, new NameSort());
        return persons.toArray(new Person[persons.size()]);
    }

此代码将在您的排序JButton的动作侦听器中调用。