Нулевые объекты плохо воспроизводятся в JComboBox.Например, метод getSelectedIndex
поля со списком, который запускается при выборе элемента, вернет -1, если объект null
.Также могут существовать другие методы, которые выполняют нулевые проверки и могут возвращать неверные результаты.
Но вы можете попробовать переопределить getSelectedIndex
, чтобы он возвращал 0 вместо -1, если объект нулевой.Также переопределите selectedItemChanged
, чтобы не проверять наличие нулей.Кажется, что работает следующее, но могут быть и другие методы, которые тоже необходимо переопределить:
JComboBox mComboBox = new JComboBox(new String[]{"One", "Two"}){
@Override
public int getSelectedIndex() {
Object sObject = dataModel.getSelectedItem();
int i,c;
Object obj;
if(sObject==null){
return 0;
}
for ( i=0,c=dataModel.getSize();i<c;i++ ) {
obj = dataModel.getElementAt(i);
if ( obj != null && obj.equals(sObject) )
return i;
}
return -1;
}
@Override
protected void selectedItemChanged() {
fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.DESELECTED));
selectedItemReminder = dataModel.getSelectedItem();
fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.SELECTED));
}
};
Однако вместо того, чтобы делать вышеописанное, я бы рекомендовал использовать объект-оболочку .Например:
class StringWrapper{
final String s;
public StringWrapper(String s){
this.s=s;
}
@Override
public String toString() {
return s;
}
}
JComboBox cb = new JComboBox(new StringWrapper[]{
new StringWrapper("one"),
new StringWrapper("two"),
new StringWrapper("three")});
cb.insertItemAt(new StringWrapper(null), 0);