2012-03-18 18 views
1

JPanelをpropertyChangeListenerとともに使用し、特定の変数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(); 
    } 
} 

私は日食でデバッグモードを使用するとき、私はmodelに変更があるたびに、それはコールpropertyChangeをオフにトリガし、それがまたrevalidate上で実行されていることがわかりますrepaintですが、ディスプレイはJPanelのままです。それは自分自身を再レンダリングしているようではありません。 私がここで欠けている基本的なことは何ですか?

EDIT:

次のようにプロパティIM交換の一例の抜粋である -

labelMacroModelタイプ LabelMacroModeladdedMacroModelである
labelMacroModel.addMacroModel(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? –

+0

変更するプロパティの例を挙げることはできますか? –

+0

@PerryMonschau - 変更されたプロパティのコードスニペットを提供するように編集しました。 – ping

答えて

4

パネルのコンポーネントをどのように変更するかは不明です。パネルが更新されない場合、再描画/再検証は効果を持ちません。コンポーネントの配置方法を変更していない場合は、明示的に呼び出されるようにrevalidate/repaintを行う必要はありません。 JButton.setTextは、例えば、repaintを呼び出す必要なく、ボタンのラベルを変更する必要があります。

+0

これは、私がむしろremoveAll()を実行することを意味しますか?次にsetupComponents()を呼び出します。 revalidateとrepaintを使うのではなく? – ping

+2

いいえ。コンポーネント内のテキストを変更すると、repaintを呼び出さずに表示されるはずです。 Revalidateは、コンポーネントのレイアウトを変更するときに一般的に必要です。 –

+0

これについてはわかりません - 私の答えを見てください – davidfrancis

2

上記のAKJの回答を拡大するには、プロパティの変更に関するコンポーネントを再構築する必要があります。だから、すべてを取り除くことは、これを行う一つの方法です。この作業が完了したら、モデルの更新をGUIにプッシュすることをより選択的にすることができます。たとえば、新しいエントリが追加された場合、これを反映するために新しいコンポーネントを追加するだけです。しかし、all/readdを削除することは、多くの場合には問題ありません。 HTH。

+0

どちらの回答も有効です。私はそれがGUI部品を作り直すことがどれほど費用がかかっているかにかかっていると思います。 –

関連する問題