我有一个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
。
答案 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
,因此您需要打开它们