2012-03-18 95 views
1

我使用帶有propertyChangeListener的JPanel,並希望它根據每當特定變量model發生更改時自行重新渲染。我爲同一代碼如下 -
Java swing - Jpanel不會自我渲染/重新繪製

public class LabelMacroEditor extends JPanel implements PropertyChangeListener { 

    private static final long serialVersionUID = 1L; 
    private LabelMacroModel model; 

    public LabelMacroEditor(LabelMacroModel bean) { 

     this.model = bean; 
     model.addPropertyChangeListener(this); 
     setupComponents(); 
     validate(); 
     setVisible(true); 
    } 

    public void setupComponents() 
    { 

     Box allButtons = Box.createVerticalBox(); 
     JScrollPane macroModelScroller = new JScrollPane(allButtons); 
     macroModelScroller.setPreferredSize(new Dimension(300, 200)); 
     for(MacroModel macroModel : model.getMacroModelList()) 
     { 
      LabelMacroEditorEditableEntity macroEditorEntity = new LabelMacroEditorEditableEntity(macroModel); 
      Box entityBox = Box.createHorizontalBox(); 
      entityBox.add(macroEditorEntity.getUpButton()); 
      entityBox.add(Box.createHorizontalStrut(15)); 
      entityBox.add(macroEditorEntity.getMacroDetailsButton()); 
      entityBox.add(Box.createHorizontalStrut(15)); 
      entityBox.add(macroEditorEntity.getDownButton()); 

      allButtons.add(entityBox); 
     } 
     add(macroModelScroller); 
    } 

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

當我使用調試模式在eclipse中我可以看到,每當有變化model它激發了呼叫propertyChange,它也運行在revalidaterepaint但只有JPanel顯示保持不變。它似乎沒有讓自己放棄。 我在這裏失蹤的任何基本的東西?

編輯:

屬性IM變化的一個例子代碼段如下 -

labelMacroModel.addMacroModel(addedMacroModel); 

其中labelMacroModel是類型LabelMacroModel的和addedMacroModel是類型Macro

的現在相關部分LabelMacroModel類火災財產變更如下 -

private List<MacroModel> macroModelList;// this is the list of all MacroModels 
public void addMacroModel(MacroModel macroModel) { 
     macroModelList.add(macroModel); 

     pcs.fireIndexedPropertyChange("LabelMacroModel", macroModelList.size(), null, macroModel); 
    } 
+0

*「我在這裏錯過的任何基本的東西?」*一個SSCCE讓我感興趣? – 2012-03-18 18:42:01

+0

你能舉一個你改變的例子屬性嗎? – 2012-03-18 18:44:23

+0

@PerryMonschau - 我編輯過,以提供改變屬性的代碼片段。 – ping 2012-03-18 18:53:15

回答

4

它不清楚如何更改面板中的組件。如果面板未更新,則重繪/重新驗證將不起作用。我認爲如果你沒有修改組件佈局的方式,你不應該需要顯式調用重新驗證/重新繪製。 JButton.setText應該例如改變按鈕的標籤而不需要調用重畫。

+0

這是否意味着我寧願做一個removeAll();然後一個setupComponents();而不是使用重新驗證和重繪? – ping 2012-03-18 18:54:49

+2

不可以。如果您修改組件中的文本,它應顯示而不調用repaint。通常在修改組件的佈局時需要重新驗證。 – 2012-03-18 19:22:49

+0

不確定 - 請參閱我的回答 – davidfrancis 2012-03-18 23:00:32

2

爲了擴大上述AKJ的答案,我認爲你應該重建你的物業變化的組件。所以做一個刪除所有然後讀取是做到這一點的一種方法。一旦你得到了這個工作,你可以更有選擇地將模型更新推入到GUI中,例如,如果添加了新條目,那麼只需添加一個新組件來反映這一點。儘管如此,remove all/readd對很多情況都很好。 HTH。

+0

這兩個答案都是有效的,1+票。我認爲這取決於重新創建GUI組件的成本。 – 2012-03-19 00:24:17