我有一个
JComboBox
,它显示的是不是字符串的项目,尽管它们确实有toString()
方法并且可以显示为字符串。
我声明为:
public class AddressCombo extends JComboBox<Address> {
public AddressCombo(ComboBoxModel<Address> model) {
super(model);
setEditable(true);
}
public AddressCombo(Address... addresses) {
this(new DefaultComboBoxModel<Address>(addresses));
}
// Other stuff snipped
}
当 JComboBox 不可编辑时,这工作正常,但如果我使其可编辑,则所选项目在编辑时会变成
java.lang.String
,这不是我们想要的!此外,字符串可能根本不代表有效值(我们有一个解析器可以检测到这一点)。
设置 JComboBox 的最佳方法是什么:
String
我发现以下解决方案有效:
java.text.Format
的子类来封装格式化/解析代码BasicComboBoxEditor
的自定义子类以将格式化程序与 JFormattedTextField
JComboBox
子类上设置编辑器以使用上面的有兴趣的代码:
public class AddressCombo extends JComboBox<Address> {
private class AddressEditor extends BasicComboBoxEditor {
@Override
public Object getItem() {
try {
return AddressFormat.INSTANCE.parseObject(editor.getText());
} catch (Exception e) {
return null;
}
}
@Override
protected JFormattedTextField createEditorComponent() {
JFormattedTextField fld= new JFormattedTextField(AddressFormat.INSTANCE);
fld.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
return fld;
}
}
public AddressCombo(ComboBoxModel<Address> model) {
super(model);
setEditor(new AddressEditor());
setEditable(true);
}
public AddressCombo() {
this(new DefaultComboBoxModel<Address>());
}
public AddressCombo(Address... addresses) {
this(new DefaultComboBoxModel<Address>(addresses));
}
// Irrelevant stuff snipped
}