【问题标题】:Cannot access JList items in custom property editor无法在自定义属性编辑器中访问 JList 项目
【发布时间】:2012-03-12 16:16:44
【问题描述】:

我在 NetBeans 编辑器区域中有一个简单的 OutlineView,它显示了两列。第二列单元格的内容应通过 PropertySupport 使用自定义属性编辑器进行设置。定制属性编辑器包含一个允许多项选择的 JList。

PropertySupport 类看起来像

public class CityProperty extends PropertySupport.ReadWrite<String> { 

    Customer c; 

    public CityProperty(Customer c, HashMap<String, Boolean> optionalCities) { 
        super("city", String.class, "City", "Name of City"); 
        setValue("labelData", optionalCities); 
        this.c = c; 
    } 

    @Override 
    public String getValue() throws IllegalAccessException, InvocationTargetException { 
        return c.getCity(); 
    } 

    @Override 
    public PropertyEditor getPropertyEditor() { 
        return new CityPropertyEditor(c); 
    } 

    @Override 
    public void setValue(String newValue) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
        c.setCity(newValue); 
    } 
}

PropertyEditor 看起来像

public class CityPropertyEditor extends PropertyEditorSupport implements ExPropertyEditor { 

    Customer c; 
    PropertyEnv env; 
    public CityPropertyEditorPanel editor = null; 

    public CityPropertyEditor(Customer c) { 
        this.editor = new CityPropertyEditorPanel(); 
        this.c = c; 
    } 

    @Override 
    public String getAsText() { 
        String s = (String) getValue(); 
        if (s == null) { 
            return "No City Set"; 
        } 
        return s; 
    } 

    @Override 
    public void setAsText(String s) { 
        setValue(s); 
    } 

    @Override 
    public void attachEnv(PropertyEnv env) { 
        this.env = env; 
    } 

    @Override 
    public Component getCustomEditor() { 
        HashMap<String, Boolean> cities = (HashMap<String, Boolean>) env.getFeatureDescriptor().getValue("labelData"); 
        DefaultListModel model = new DefaultListModel(); 


        /* selection in the gui */ 
        int[] selectedIdxs = new int[cities.size()]; 
        int idx = 0; 
        for (String str : cities.keySet()) { 
            model.addElement(str); 
            if (cities.get(str) == Boolean.FALSE) { 
                selectedIdxs[idx] = model.indexOf(str); 
                idx++; 
            } 
        } 
        if (selectedIdxs.length > 0){ 
            editor.jList.setSelectedIndices(selectedIdxs); 
        } 
        editor.jList.setModel(model); 

        return editor; 
    } 

    @Override 
    public boolean supportsCustomEditor() { 
        return true; 
    } 

    @Override 
    public Object getValue() { 
        System.out.println("getValue(): " + editor.jList.getSelectedValuesList());    
        System.out.println("getValue(): " + editor.jtf.getText()); 

        return super.getValue(); 
    } 
}

编辑器 CityPropertyEditorPanel() 本身是一个简单的 JPanel,带有一个 JList 和一个 JTextField。

我的代码创建了一个很好的自定义编辑器,其中列出了所有项目,但它没有从列表中返回新选择的项目。我现在的问题是,如何将 JList 中的选定项目返回 CityProperty 类?我的尝试是使用

editor.jList.getSelectedValuesList()); 

在 getValue() 方法中,但结果始终为空。 JTextField 也是如此,新的写入值也不会传回。

我在这里做错了什么?

【问题讨论】:

  • 如果这是特定于 netbeans 的(无法确定,不是 nb 的粉丝 :) 您可以考虑添加 netbeans 标签以吸引可能知道的人群...
  • PropertyEditorSupport 和 PropertyEditor 主要属于 java.beans。
  • 我的声誉很低(仍然),即。我不允许放置更多标签。对不起。
  • 好的,我可以再为你添加 2 个标签 - 只需要知道你想要哪个
  • +1 用于发布代码、为网站正确格式化、提出明确的问题……以及让您更接近“多标签”级别。 :)

标签: java swing propertyeditor


【解决方案1】:

我想我找到了解决方案/解决方法。

当我激活 PropertyEnv.STATE_NEEDS_VALIDATION 功能时,CityPropertyEditor 识别了“编辑器”对象的内容。然后 CityPropertyEditor 中的代码必须覆盖 attacheEnv 方法并包含 VetoableChangeListener

@Override
public void attachEnv(PropertyEnv env) {
    this.env = env;
    env.setState(PropertyEnv.STATE_NEEDS_VALIDATION);

    env.addVetoableChangeListener(new VetoableChangeListener() {

        @Override
        public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
            /* User has pushed OK */
            for (Entry entry : editor.isoValNew.entrySet()){
                isoVal.put((Double) entry.getKey(), (Boolean) entry.getValue());
            }
        }
    });
}

而 CityPropertyEditorPanel() 中的 Jlist 本身有一个 ListSelectionListener 来更新 Map 变量 isoValNew

    isoValueList.addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent e) {
            isoValNew.clear();

            for (Object obj : isoValueList.getSelectedValues()) {
                isoValNew.put((Double) obj, Boolean.TRUE);
            }
        }
    });

我确信这不是一个完美的解决方案,但在我的情况下它可以正常工作。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多