2012-03-18 8 views
1

나는 propertyChangeListener와 함께 JPanel을 사용하고 특정 변수 model이 변경 될 때마다 다시 렌더링하려고합니다. 내가 model에 변경이있을 때마다 통화 propertyChange을 트리거 것을 볼 수 있습니다 이클립스 디버그 모드를 사용하면
자바 스윙 - 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(); 
    } 
} 

을하고도 revalidate 이상 실행 - 다음과 같은 내 코드입니다 repaint이지만 JPanel 디스플레이 만 동일하게 유지됩니다. 그것 자체를 다시 렌더링하지 않는 것 같습니다. 내가 누락 된 근본 사항은 무엇입니까?

편집 다음

속성 메신저 변경하는 예 단편이므로 -

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가 나를 관심있게 만드나요? –

+0

변경 한 예제 속성을 제공 할 수 있습니까? –

+0

@PerryMonschau - 메신저가 변경되는 속성의 코드 스 니펫을 제공하도록 편집했습니다. – ping

답변

4

패널에서 구성 요소를 어떻게 변경하는지 명확하지 않습니다. 패널이 업데이트되지 않은 경우 다시 칠하기/다시 유효성 검사가 적용되지 않습니다. 구성 요소를 배치하는 방법을 수정하지 않으면 revalidate/repaint를 명시 적으로 호출하지 않아도됩니다. 예를 들어 JButton.setText는 repaint를 호출 할 필요없이 버튼의 레이블을 변경해야합니다.

+0

그 뜻은 removeAll(); 그리고 나서 setupComponents(); revalidate와 repaint를 사용하는 것보다? – ping

+2

아니요. 구성 요소의 텍스트를 수정하면 다시 칠하기를하지 않고 표시되어야합니다. Revalidate는 일반적으로 구성 요소의 레이아웃을 수정할 때 필요합니다. –

+0

이것에 대해 확실하지 않음 - 내 대답 참조 – davidfrancis

2

위의 AKJ에 대한 답변을 확장하려면 속성 변경시 구성 요소를 재구성해야한다고 생각합니다. 따라서 모든 것을 제거하는 것은 이것을 수행하는 한 가지 방법입니다. 일단이 작업을하면 모델 업데이트를 GUI로 밀어 넣는 것에 대해보다 선택적으로 할 수 있습니다. 예를 들어 새 항목이 추가 된 경우이를 반영하기 위해 새 구성 요소를 추가하면됩니다. 제거 all/readd는 많은 경우에 괜찮습니다. HTH.

+0

두 대답 모두 유효합니다. GUI 구성 요소를 다시 만드는 것이 얼마나 비쌉니까에 달려 있다고 생각합니다. –