在 JComboBox 中编辑非字符串值

问题描述 投票:0回答:1

我有一个

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 的最佳方法是什么:

  1. 它管理自定义(POJO)类型的项目
  2. 可编辑
  3. 当用户编辑字段时,可以使用自定义解析器来解析用户的输入,看看它是否是正确的类型
  4. 如果输入无法解析,可以对其进行更正或使用默认值
  5. 因此,所选项目将始终属于正确的类,而不是 Java
    String
java swing parsing jcombobox
1个回答
0
投票

我发现以下解决方案有效:

  • 创建
    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
}
© www.soinside.com 2019 - 2024. All rights reserved.