JComboBox多次输入相同的条目

时间:2017-07-07 10:54:53

标签: java swing user-interface jcombobox

我有一个JComboBox,我正在传递一个字符串数组。某些值在该数组中多次。组合框被正确渲染,但我无法选择所有条目。

String[] entrys = {"A", "B", "C", "A"};
JComboBox combo = new JComboBox(entrys);

在此示例中,我将无法选择第二个A,因为数组中早先已有A

combo.addItemListener(new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent e) {
        if(e.getStateChange() == ItemEvent.SELECTED)
            System.out.println(combo.getSelectedIndex());
    }
});

如果我按下第二个A,它仍然会选择第一个并打印0

  • 让这个工作的最佳方法是什么?
  • 我必须写一个 自定义ComboBox模型?

1 个答案:

答案 0 :(得分:1)

所以,基本上,JComboBox正在getSelectedIndex方法中执行此操作...

public int getSelectedIndex() {
    Object sObject = dataModel.getSelectedItem();
    int i,c;
    E obj;

    for ( i=0,c=dataModel.getSize();i<c;i++ ) {
        obj = dataModel.getElementAt(i);
        if ( obj != null && obj.equals(sObject) )
            return i;
    }
    return -1;

这就是为什么当您选择A时,它会返回0,因为它会在位置0找到与所选值匹配的对象。您需要围绕值生成唯一的对象包装器,以便进行比较以选择正确的值

也许像......

public class Wrapper {
    private final String value;

    public Wrapper(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    // I personally prefer to use a custom cell renderer, but 
    // for the sake of brevity, I'm using the toString method instead
    @Override
    public String toString() {
        return value;
    }

}

然后我们需要映射String值...

String[] entrys = {"A", "B", "C", "A"};
Wrapper[] wrappers = Arrays.stream(entrys).map((String t) -> new Wrapper(t)).toArray(Wrapper[]::new);
JComboBox<Wrapper> b = new JComboBox<>(wrappers);

我们已经完成所有设定。请记住,当您使用Wrapper时,您正在处理String课程,而不是getSelectedItem,因此您需要打开它们