2011-01-07 10 views
1

Classから別のJFrameに渡す値の間に問題がありますpassクラスからJFrameへの値

my codeはMVCモデルに従います。したがって、1つのクラスはコントローラ、1つのjframeはビュー、1つのクラスはモデルです。

私はコントローラー上で値を取得するためにいくつかのハンドル処理があり、この値をjframeにしたいが、コンストラクターでは渡しません。 クラスからjframeに値を渡すにはどうすればいいですか?値渡し時にjframeはそれを使って処理します。

例:

public class A{ 
private String str; 
      public A(){ 

      } 

      public void handle(){ 
       ViewFrame v = new ViewFrame(); 
       v.setVisible(true); 
       v.pack(). 
       v.setSize(330,600); 
       str = "Hello World"; //init value here 
       v.getString(str);// pass value to jframe here. 
      } 
} 

=======================

public class ViewFrame extends JFrame{ 
private String str; 
     public ViewFrame(){ 
     System.out.println(str); 
     } 

    public String getString(String str){ 
     return this.str = str; 

    } 


} 

が、それはnullを返します?

+0

ViewFrameとは何ですか?あなたはBを意味しましたか? – sjr

+0

申し訳ありません、私の間違いは編集されました – MYE

答えて

1

最初の提案:getString(String str)setString(String str)に実際に文字列を渡すため、名前を変更してください。あなたが同じ方法で値を受信したい場合:これは期待通りに動作します:

public String setString(String str) { 
    this.str = str; 
    return this.str; 
} 

しかし、このようなセッターを実装することはかなり珍しいです。純粋なセッターは通常、値を返しません。 ViewFrame


コンストラクタは2つの問題があります。まず、スーパークラスJFrameでコンストラクタを呼び出さないでください。 JFrameには公開のデフォルトのコンストラクタがあるため、これは少しだけうまく動作します。しかし、とにかくサブクラスのコンストラクタは常にスーパークラスのコンストラクタを呼び出す必要があります(super()、タイトル付きフレームの場合はsuper("My ViewFrame"))。 strは、この時点で初期化されていないため、

その後、表現System.out.println(str)nullを印刷します。 最初にコンストラクターが呼び出されます(strの値を印刷します(最初はnull)。、次にを呼び出し、strフィールドを「初期化」します。あなたが期待される結果を与える可能性があり

ViewFrame v = new ViewFrame("Hello World"); 
    v.setVisible(true); 
    // ... 

これに

public ViewFrame(String str){ 
    super(); 
    this.str = str; 
    System.out.println(str); 
} 

とコントローラロジック:

はにあなたのコンストラクタを変更することを検討してください。

+0

Andreasありがとうございましたが、それは私のために働いていません – MYE

+0

Andreasありがとう、私はコンストラクタを使用する必要はありません?それはどういうことでしょうか? – MYE

+0

@MYE - 私はあなたのコンストラクタ 'ViewFrame()'を 'ViewFrame(String str)'に置き換え、私の例では置換を使用しました。 –

1

@ Andreas_Dの分析は正しいです。ここに、いくつかの洞察を提供するより完全な例があります。

import javax.swing.JFrame; 
import javax.swing.JLabel; 

/** @see https://stackoverflow.com/questions/4623020 */ 
public class A { 

    private static String str = "Hello, world!"; 

    public static void main(String[] args) { 
     ViewFrame v = new ViewFrame(str); 
     v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     v.pack(); 
     v.setLocationRelativeTo(null); 
     v.setVisible(true); 
     System.out.println("Equals: " + str.equals(v.getString())); 
    } 
} 

class ViewFrame extends JFrame { 

    private String str; 

    public ViewFrame(String str) { 
     this.str = str; 
     this.add(new JLabel(str, JLabel.CENTER)); 
    } 

    public String getString() { 
     return this.str; 
    } 
} 

この関連MVC exampleも一見価値があります。

関連する問題