2012-03-17 61 views
1

我的使用情况是一个List<String>传递给Jpanel,并在每个ListString,则JPanel呈现UI组件。这个UI组件由3个按钮组成,我现有的代码用于我的给定用例如下。 -
为“UI组件”中的代码如下 -的Java Swing - JPanel并的PropertyChangeListener

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(); 
    } 

} 

的代码工作正常,在通过List所有Strings 。我希望我的面板获取List可能发生的任何更改,如添加或删除,并相应地添加/删除相关的相应UI组件。我认为这可以通过使用PropertyChangeListener来完成,但无法解释我的代码。
任何想法或建议,我可以使我的面板渲染/重新渲染的东西,只要有改变List会有所帮助。

+0

请学习java命名约定并坚持使用它们 – kleopatra 2012-03-18 15:19:16

回答

2

这里您需要的是一个可观察的集合。这应做到: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一起使用的数据绑定库。

+1

完美,我没有意识到这个类已经存在,并且正在写一个答案。谢谢! – vextorspace 2012-03-17 20:55:42

+0

http://commons.apache.org/dormant/index.html – Simon 2012-03-17 21:01:45

+0

@Simon - 感谢您的回答。我浏览了javadoc,并对观察者模式有一个公正的理解。我不完全确定ObservableCollection如何与我的代码绑定。我会不需要PropertyChangeListener吗?请原谅我的无知,但是关于如何使用ObservableCollection的代码片段以及它如何绑定到我的代码中会帮助我更好地理解。 – ping 2012-03-17 22:20:42