Не удается получить доступ к элементам JList в редакторе пользовательских свойств

У меня есть простой 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, где новое записанное значение также не передается обратно.

Что я здесь не так делаю?

1 ответ

Я думаю, что нашел решение / обходной путь.

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, который обновляет переменную 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);
            }
        }
    });

Я уверен, что это не идеальное решение, но оно отлично работает в моем случае.

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам