2012-02-22 80 views
2

我在显示两列的NetBeans编辑器区域中有一个简单的OutlineView。第二列单元格的内容应可通过PropertySupport的自定义属性编辑器进行设置。自定义属性编辑器包含一个允许多项选择的JList。无法访问定制属性编辑器中的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); 
    } 
} 

的属性编辑器看起来像

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类?我的尝试是在使用getValue()方法时使用

editor.jList.getSelectedValuesList()); 

但结果始终为空。对于JTextField也是如此,新的写入值也不会被传回。

我在这里做错了什么?

+0

如果这是NetBeans特定的(不能真正说出,不是一个粉丝:)你可能会考虑添加netbeans标签来吸引人们可能知道... – kleopatra 2012-02-22 10:50:26

+0

主要是,PropertyEditorSupport和PropertyEditor属于java 。豆。 – WeserLinux 2012-02-22 10:54:10

+0

我的声望很低(仍然),即。我不允许放置更多标签。抱歉。 – WeserLinux 2012-02-22 10:54:49

回答

0

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

CityPropertyEditor在激活PropertyEnv.STATE_NEEDS_VALIDATION功能时识别“编辑器”对象的内容。然后在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()); 
      } 
     } 
    }); 
} 

而()将JList在CityPropertyEditorPanel本身具有ListSelectionListener谁更新地图可变isoValNew

isoValueList.addListSelectionListener(new ListSelectionListener() { 

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

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

我当然,这不是一个完美的解决方案,但它对我来说很好。

希望这可以帮助别人。