我的用例是将List<String>传递给Jpanel,对于String中的每个ListJPanel呈现UI组件。该UI组件由3个按钮组成,针对给定用例的当前代码如下。 -'UI组件'的代码如下-

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都适用。我希望面板能够对List进行任何更改,例如添加或删除,并相应地添加/删除相关的相应UI组件。我认为这可以通过使用PropertyChangeListener来完成,但无法在我的代码中解决。
一旦List发生更改,有关如何使我的Panel渲染/渲染东西的任何想法或建议都将有所帮助。

最佳答案

您需要的是一个可观察的集合。应该这样做: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
        }
    }
}


顺便说一句:有助于将商务对象绑定到GUI并对修改做出响应(双向)的另一个概念是数据绑定。看一下this,它是Swing常用的数据绑定库。

08-05 05:55
查看更多