2012-01-26 9 views
0

私は2クラスEngine.javaWindow.javaを持っています。 Window.javaにはEngine.javaのインスタンスを作成するボタンがあります。2番目のクラスの別のクラスのSwingコンポーネントへのアクセス

Window.javaEngine.javaに渡すにはどうすればよいですか?

私はこれを使うことができると知っていますが、これはボタンをクリックしたその時点のボタンを表しています。

Window.javaEngine.javaのすべてのコンポーネントにアクセスしたいからです。

public class Engine{ 
    Window window; 

    public Engine(Window en){ 
     window = en; 
    } 
    //rest of your code 
} 

public class Window(){ 

    btnDownload.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
       //At the point where you create the Engine 
        Engine en = new Engine(this); 
       //rest of your code 
     } 
} 
+0

OOPの基本に戻る必要があります。投票を終了する。 – mre

答えて

0

これは動作するはずです...

public class Window(){ 

Windows ref = this; 
btnDownload.addMouseListener(new MouseAdapter() { 
     @Override 
      public void mouseClicked(MouseEvent e) { 
         Engine en = new Engine(ref); 
       } 
+1

これが機能するには、 'ref'は' final'でなければなりません。しかし、なぜあなたは単に認定を使用することができます余分な自己参照を作成する? – mre

2

理由は、私はEngine.java

内Window.javaのすべてのコンポーネントにアクセスできるようにしたいということです

これを実装しても、Engineはのフィールドにのみアクセスできますpublic宣言され(これらは同じパッケージ内にある場合を除き、その場合、Engineもアクセスすることができるであろうが、全てdefaultWindow方法スコープ)。

1

は、なぜないWindow.thisを提案しようとしてますが、部品のあなただけ興味を持っている場合した

public class Engine { 
    Component[] components; 

    public Engine(Component[] components){ 
     this.components = components; 
    } 
} 

public class Window() { 

    JButton btnDownload; 
    JButton btnUpload; 

    public Window() { 

     btnDownload = new JButton("Download"); 
     btnDownload.setName("Download"); 

     btnUpload = new JButton("Upload"); 
     btnUpload.setName("Upload"); 

     btnDownload.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
        // create engine passing reference to only the components... 
        Engine en = new Engine(Window.this.getComponents()); 
        // rest of your code 
      } 
    } 

    public Component[] getComponents() { 
     return new Component[] { btnDownload, btnUpload }; 
    } 
} 

コンポーネントのjava.awt.Componentある、またはあなたがスイングからのJComponentを使用することができます。

このようなことをした場合、各コンポーネントは名前だけで意味があると思います。したがって、各コンポーネントでsetNameメソッド(Windowコンストラクタに表示)を使用し、エンジンで何かを実行して、必要に応じて名前にアクセスすることができます。これはおそらく悪いことです。いずれにしても、エンジンのさまざまなコンポーネントへの参照が必要です。上記の例が合わない場合は、追加のクラスまたはインタフェースを使用してコンポーネントを公開することができます。その後

public class MyParams { 
    private Component download; 
    private Component upload; 

    public MyParams(Component download, Component upload) { 
     this.upload = upload; 
     this.download = download; 
    } 

    public Component getUpload() { 
     return this.upload; 
    } 

    public Component getDownload() { 
     return this.download; 
    } 
} 

エンジンの作成:

Engine e = new Engine(new MyParams(Window.this.btnDownload, Window.this.btnUpload)); 

エンジンコンストラクタ:

this.myParams.getUpload().setText("Engine class has changed me"); 

は完全にウィンドウを渡しについてCUGAに同意:エンジンにおけるそれら

public Engine(MyParams myParams) { 
    this.myParams = myParams; 
} 

アクセス参照。この種のものは、優れたクラスのカプセル化技術に反するものです。

思考のための食べ物

関連する問題