2011-12-06 8 views
1

私は自分の掃海艇を現在開発中です。スイングはモデルビューコントローラの設計パターンに従います。 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を削除して新しいフレームをフレームに追加する必要があります。

おそらく、新しいラベル全体ではなく、既存のラベルにテキストを設定する方が理にかなっていますが、

+0

MVCについては何ですか? –

+0

2つの承認のどちらもうまくいきませんでした。古いJLabelを削除して新しいJLabelを追加しますか?第一\t \t \t \t \t:「無効SETINFO(JLabelの情報){ \t \t \t \t \t \tのremove(これ。情報); \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を構築するときは、構築中または設定ツールを使用してモデルを渡す必要があります。 JTableはモデルにリスナーを追加して、モデルの変更についての情報を取得します。このリスナーをコントローラとして見ることができます。

しかし、これはSwingクラスの任意の組み合わせを使用すると、互いの変更について自動的に通知されることを意味するものではありません。あなたのケースでは、ラベルはダイアログの「モデル」ではなく、ラベルとダイアログの間に「コントローラ」というものはありません。そのような変更を行うときは、ダイアログに自分自身に通知する必要があります(おそらくダイアログにもラベルを追加する必要があります)。

ああ、私は

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があります。

関連する問題