Java Swing - JPanel и PropertyChangeListener - PullRequest
1 голос
/ 18 марта 2012

В моем случае использования List<String> передается Jpanel, а для каждого String в List JPanel отображает компонент пользовательского интерфейса. Этот компонент пользовательского интерфейса состоит из 3 кнопок, и мой текущий код для данного варианта использования выглядит следующим образом. -
Ниже следует код для компонента пользовательского интерфейса -

public class MacroEditorEntity implements ActionListener {
    private String macro;
    private JButton upButton;
    private JButton downButton;
    private JButton MacroDetailsButton;

    public MacroEditorEntity(String macro) {
    this.macro = macro;
    upButton =  new JButton("Up");
    downButton = new JButton("Down");
    MacroDetailsButton =  new JButton(macro);

    upButton.addActionListener(this);
    downButton.addActionListener(this);
    MacroDetailsButton.addActionListener(this);
}

    @Override
    public void actionPerformed(ActionEvent evt) {

        if(evt.getSource().equals(MacroDetailsButton))
        {
            System.out.println(macro);
        }
    }

    public JButton GetUpButton()
    {
        return upButton;
    }
    public JButton GetDownButton()
    {
        return downButton;
    }
    public JButton getMacroDetailsButton()
    {
        return MacroDetailsButton;
    }
}

Код для моей панели выглядит следующим образом -

public class MacroEditor extends JPanel implements PropertyChangeListener {

    private static final long serialVersionUID = 1L;
    private List<String> stringlist;

    public MacroEditor(List<String> list) {

        this.stringlist = list;
        setupComponents();
        validate();
        setVisible(true);
    }

    public void setupComponents()
    {
        Box allButtons =  Box.createVerticalBox();
        for(String string : stringlist)
        {
            MacroEditorEntity entry =  new MacroEditorEntity(string);
            Box entryBox =  Box.createHorizontalBox();
            entryBox.add(entry.GetUpButton());
            entryBox.add(Box.createHorizontalStrut(15));
            entryBox.add(entry.getMacroDetailsButton());
            entryBox.add(Box.createHorizontalStrut(15));
            entryBox.add(entry.GetDownButton());

            allButtons.add(entryBox);
        }

        add(allButtons);
    }

    @Override
    public void propertyChange(PropertyChangeEvent arg0) {
        revalidate();
        repaint();
    }

}

Код отлично работает для всех Strings в переданном List. Я хочу, чтобы моя Panel воспринимала любые изменения, которые могут произойти с List, такими как добавления или удаления, и соответственно добавляла / удаляла соответствующие соответствующие компоненты пользовательского интерфейса. Я думаю, что это можно сделать с помощью PropertyChangeListener, но я не смог учесть это в моем коде.
Любые идеи или предложения о том, как я могу сделать мой инструмент рендеринга / рендеринга Panel, как только будут внесены изменения в List, будут полезны.

1 Ответ

2 голосов
/ 18 марта 2012

Что вам нужно здесь, это заметная коллекция.Это должно сделать это: http://commons.apache.org/dormant/events/apidocs/org/apache/commons/events/observable/ObservableCollection.html

Редактировать:

Вот фрагмент кода, который вы запросили:

public class ObservableListExample implements StandardPostModificationListener,
    StandardPreModificationListener {

    public static void main(String[] args) {
        new ObservableListExample();
    }

    public ObservableListExample() {

        ObservableList list = ObservableList.decorate(new ArrayList<>(),
                new StandardModificationHandler());

        list.getHandler().addPostModificationListener(this);
        list.getHandler().addPreModificationListener(this);
        //....

    }

    @Override
    public void modificationOccurring(StandardPreModificationEvent event) {
        // before modification
        Collection changeCollection = event.getChangeCollection();
        if (event.isTypeAdd()) {
            // changeCollection contains added elements
        } else if (event.isTypeReduce()) {
            // changeCollection contains removed elements
        }
    }

    @Override
    public void modificationOccurred(StandardPostModificationEvent event) {
        // after modification
        Collection changeCollection = event.getChangeCollection();
        if (event.isTypeAdd()) {
            // changeCollection contains added elements
        } else if (event.isTypeReduce()) {
            // changeCollection contains removed elements
        }
    }
}

Кстати: еще одна концепция, которая помогает связывать объекты бизнесак вашему графическому интерфейсу и реагировать на изменения (двунаправленно) является привязка данных.Взгляните на this , библиотеку привязки данных, обычно используемую с Swing.

...