Java 无法访问自定义属性编辑器中的JList项
我在NetBeans编辑器区域中有一个简单的大纲视图,显示了两列。第二列单元格的内容应可通过PropertySupport通过自定义属性编辑器进行设置。自定义属性编辑器包含一个JList,允许多个项目选择 PropertySupport类如下所示Java 无法访问自定义属性编辑器中的JList项,java,swing,propertyeditor,Java,Swing,Propertyeditor,我在NetBeans编辑器区域中有一个简单的大纲视图,显示了两列。第二列单元格的内容应可通过PropertySupport通过自定义属性编辑器进行设置。自定义属性编辑器包含一个JList,允许多个项目选择 PropertySupport类如下所示 public class CityProperty extends PropertySupport.ReadWrite<String> { Customer c; public CityProperty(Custom
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();
}
}
在getValue方法中,但结果始终为空。JTextField也是如此,其中也不会传回新的写入值
我做错了什么 我想我找到了解决方法 当我激活PropertyEnv.STATE\u NEEDS\u验证功能时,CityPropertyEditor识别编辑器对象的内容。CityPropertyEditor中的代码必须重写AttacheNV方法并包含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,用于更新地图变量isoValNew
isoValueList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
isoValNew.clear();
for (Object obj : isoValueList.getSelectedValues()) {
isoValNew.put((Double) obj, Boolean.TRUE);
}
}
});
我相信这不是一个完美的解决方案,但它在我的情况下运行良好
希望这对某人有所帮助。我想我找到了解决方案/解决方法 当我激活PropertyEnv.STATE\u NEEDS\u验证功能时,CityPropertyEditor识别编辑器对象的内容。CityPropertyEditor中的代码必须重写AttacheNV方法并包含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,用于更新地图变量isoValNew
isoValueList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
isoValNew.clear();
for (Object obj : isoValueList.getSelectedValues()) {
isoValNew.put((Double) obj, Boolean.TRUE);
}
}
});
我相信这不是一个完美的解决方案,但它在我的情况下运行良好
希望这有助于某人。
如果NETBeaS具体不能真正说明,不是NB的粉丝:你可以考虑添加NETBeAs标签来吸引可能知道的人群……主要是PrimeTytRealSudio和PrimeType编辑器属于JavaBeN.我的名声仍然很低,即,我不允许放更多的标签。抱歉。好的,我可以再为您添加2个标签-只需知道您想要哪个+1用于发布代码、正确设置网站格式、明确提问……以及让您更接近“多标签”级别:如果这是NETBeaS具体不能真正说明的,而不是NB的粉丝:你可能会考虑添加NETBeAs标签来吸引可能知道的人群……主要是PrimeTydioRooStand和PrimeType编辑器属于JavaBeN.我的名声仍然很低,即,我不允许放更多的标签。抱歉。好的,我可以再为您添加2个标签-只需知道您想要哪个+1用于发布代码、正确设置网站格式、明确提问……以及让您更接近“多标签”级别: