2011-12-06 2 views
1

현재 내 자신의 지뢰 찾기를 개발 중입니다. 스윙은 모델 - 뷰 - 컨트롤러 디자인 패턴을 따른다. MVC에서 모델에 변화가있을 때마다 을 배웠습니다. 컨트롤러는 그 변화를보기에서 역시 나타냅니다.. 그러나이 예제에서는 setTitlesetInfo의 변경 사항을보기에 반영하는 방법을 추적 할 수 없습니다.Model-View-Controller에서 모델을 변경해야하는 이유는 무엇입니까? 뷰에서 변경이 트리거되지 않습니까?

여기서 대화 상자의 제목을 설정하면 실제 콘텐츠 (모델)가 변경되지만 출력 (보기)에는 해당 변경 사항이 없습니다.

//InfoDisplayer is inner class of class MenuActionListener 
class InfoDisplayer extends JDialog { 
    JLabel info; 
    BorderLayout infoBorderLayout = new BorderLayout(); 

    public InfoDisplayer(JFrame ownerFrame) { 
     super(ownerFrame,true); 
     info = new JLabel(); 
     setFocusable(false);       
     setSize(300,400); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     setLayout(infoBorderLayout); 
     add(info,BorderLayout.SOUTH); 
     setVisible(true); 
    } 

    void setInfo(JLabel info) { 
     this.info = info; 
    } 

    public void setTitle(String title) { 
     super.setTitle(title); 
    }         
} 

if ((event.getActionCommand()).equals("HowToPlay")) { 
    InfoDisplayer instructionsDisplay = new InfoDisplayer(gUIManagerFrame); 
    //gUIManagerFrame is an object of its outer class,MenuActionListener 
    instructionsDisplay.setTitle("INSTRUCTIONS"); 
    instructionsDisplay.setInfo(new JLabel("<html><h1><B>INSTRUCTIONS</B></h1></html>")); 
} else {// if about is clicked!! 
    InfoDisplayer aboutDisplay = new InfoDisplayer(gUIManagerFrame); 
    aboutDisplay.setTitle("MineSweeper v0.1"); 
    aboutDisplay.setInfo(new JLabel("<html><h1><B>MineSweeperv1.0</B></h1> </html>")); 
}   

답변

1

이전 jlabel을 제거하고 새 프레임을 프레임에 추가해야합니다.

아마도 새 레이블이 아닌 기존 레이블에 텍스트를 설정하는 것이 더 적합 할지라도.

+0

MVC에 대한 모든 단어는 무엇입니까? –

+0

2 건의 승인 중 어느 것도 작동하지 않았습니다. 어떻게 이전 JLabel을 제거하고 새 JLabel을 추가합니까? \t \t \t \t \t 1 : "무효 setInfo (JLabel의 정보) { \t \t \t \t \t \t 제거 (이.정보); \t \t \t \t \t \t this.info.setText (info.toString()); \t \t \t \t add (this.info, BorderLayout.SOUTH); \t \t \t \t \t} "2 : "\t \t \t \t \t 무효 setInfo (JLabel의 정보) { \t \t \t \t \t \t 제거 (this.info); \t \t \t \t \t \t this.info = info; \t \t \t \t \t add (info, BorderLayout.SOUTH); \t \t \t \t \t}는 "업데이트에 대한 –

+0

+1 이상 교체하십시오. [여기] MVC (http://stackoverflow.com/a/8401255/230513) 죄송 – trashgod

1

실제로 스윙은 모델과 뷰면을 가지고 있습니다. 예를 들어, JTable에서는 JTable가 뷰이며, TableModel이 모델입니다. JTable을 구성 할 때, 생성 중에 또는 setter를 사용하여 모델을 전달해야합니다. 그러면 JTable은 모델 변경에 대한 정보를 얻기 위해 모델에 리스너를 추가합니다. 이 청취자를 컨트롤러로 볼 수 있습니다.

그러나 이것은 당신이 임의의 조합의 스윙 클래스를 사용할 때 자동으로 서로의 변경 사항에 대한 정보를 얻는다는 것을 의미하지 않습니다. 귀하의 경우 레이블은 대화 상자의 '모델'이 아니며 레이블과 대화 상자 사이에 '컨트롤러'같은 것이 없습니다. 이러한 변경 작업을 수행 할 때 직접 대화에 알릴 필요가 있습니다 (대화 상자에 레이블을 추가 할 수도 있습니다).

아, 그리고

public void setTitle(String aTitle){ 
    super.setTitle(aTittle); 
} 

setTitle 방법을 변경하거나 완전히 제거 추천 할 것입니다. 모델의 변화, 보기에서 그 변화를 트리거 할 컨트롤러이있을 때마다이가있는 StackOverflowException

+0

에 대한 자세한 또한 super.setTitle –

+0

에 참조 변경하는 것을 잊었다 [스윙 아키텍처 개요] (http://java.sun.com/products/jfc/tsc/articles/architecture/). – trashgod

3

을 방지 할 수 있습니다. 제어기모델를 갱신 Model–View–Controller pattern에서

는 상기 모델는 일반적 observer pattern를 사용 보기 통지 것이며, 보기 그 자체를 갱신한다. 보기모델을 조사하고 결과 업데이트를 처리 할 수 ​​있습니다. 더 자세한 답변과 예가 here입니다.