2012-03-17 101 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