2011-12-06 63 views
1

我目前正在開發自己的掃雷艇。 Swing遵循模型 - 視圖 - 控制器設計模式。在MVC,我學會了每當模型發生變化時,控制器將在視圖中觸發該變化。但在這個例子中,我無法追蹤如何使setTitlesetInfo中的更改得到反映。在模型 - 視圖 - 控制器中,爲什麼在模型中改變,不會觸發視圖中的改變?

這裏,當我設置對話框的標題時,實際內容(模型)正在發生變化,但輸出(視圖)中沒有相應的更改。

//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並將新的jlabel添加到框架。

儘管設置現有標籤上的文本而不是整個新標籤會更有意義。

+0

關於MVC的任何關鍵詞? –

+0

兩種方式都沒有工作。您將如何移除舊的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} 「第二: 」 \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

Swing確實有一個模型和一個觀點。例如,在JTable中,JTable是視圖,TableModel是模型。在構建JTable時,您需要在構建過程中或通過使用setter將其傳遞給模型。然後,JTable將添加一個偵聽器到模型,以獲取有關任何模型更改的信息。您可以將此偵聽器視爲控制器。

但是,這並不意味着當您使用Swing類的任意組合時,它們會自動地神奇地獲知有關其他更改的信息。就你而言,標籤當然不是你的對話框的'模型',並且在你的標籤和對話框之間不存在'控制器'之類的東西。當你做出這樣的改變時,你需要自己通知對話框(也可能將標籤添加到對話框中)。

哦,我會建議您更改setTitle方法爲

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

或者完全刪除。這將避免一個StackOverflowException

+0

不好意思忘記更換成super.setTitle –

+0

另請參見[Swing架構概述](http://java.sun.com/products/jfc/tsc/articles/architecture/)。 – trashgod

3

每當有在模型改變,則控制器將觸發視圖這種變化。

Model–View–Controller pattern,當控制器更新模型,所述模型將通知視圖,通常使用的observer pattern視圖然後更新自身。 視圖可詢問模型並處理任何結果更新。有一個更詳細的答案和例子here

相關問題