У меня есть простой OutlineView в области редактора NetBeans, который показывает два столбца. Содержимое ячеек второго столбца должно быть установлено с помощью редактора пользовательских свойств через 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, где новое записанное значение также не передается обратно.
Что я здесь не так делаю?