1

とてもばかげた質問があります。

NetBeans を使用して小さなアプリを作成していますが、次の問題があります。私のメインクラスは呼び出され、さまざまな(およびトピック外の)理由で拡張した呼び出しを含む a をmainApp拡張しています..JFrameJPaneldrawingBoard

中心的な問題は、ある時点で のフィールドの 1 つにアクセスする必要があることですが、mainAppNetBeans がメイン クラスを (匿名クラスとして) インスタンス化する方法が原因で、コンテナー (つまり mainApp) への参照を取得できません。 )。

mainAppの参照を取得し、そのフィールドの値を設定するにはどうすればよいdrawingBoardですか?

4

3 に答える 3

3

拡張している場合は、コンストラクターを制御できます。必要な参照をコンストラクターに追加して渡します (もちろん、それらをメンバー変数に割り当てます)。

やった依存性注入!

于 2011-02-23T03:07:31.140 に答える
1

Window win = SwingUtilities.getWindowAncestor(myComponent); を使用して、最上位ウィンドウへの参照を取得できます。そして、最上位ウィンドウが最終的に保持する任意のコンポーネントへの参照をメソッド呼び出しに渡します。メイン クラスがトップ レベルの JFrame でもある場合 (他の JFrame を初期化していない場合)、返された Window をトップ レベルのクラス タイプにキャストし、そのパブリック メソッドを呼び出すことができます。

例えば:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo1 {
   public static void main(String[] args) {
      MainApp mainApp = new MainApp();
      mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainApp.pack();
      mainApp.setLocationRelativeTo(null);
      mainApp.setVisible(true);
   }
}

class MainApp extends JFrame {
   public MainApp() {
      getContentPane().add(new DrawingBoard());
   }

   public void mainAppMethod() {
      System.out.println("This is being called from the Main App");
   }
}

class DrawingBoard extends JPanel {
   public DrawingBoard() {
      JButton button = new JButton("Button");
      button.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            MainApp mainApp = (MainApp) SwingUtilities.getWindowAncestor(DrawingBoard.this);
            mainApp.mainAppMethod();
         }
      });
      add(button);
   }
}

グローコーダーの推奨により変更されました:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo2 {
   public static void main(String[] args) {
      MainApp2 mainApp = new MainApp2();
      mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainApp.pack();
      mainApp.setLocationRelativeTo(null);
      mainApp.setVisible(true);
   }
}

class MainApp2 extends JFrame {
   public MainApp2() {
      getContentPane().add(new DrawingBoard2(this));
   }

   public void mainAppMethod() {
      System.out.println("This is being called from the Main App");
   }
}

class DrawingBoard2 extends JPanel {
   private MainApp2 mainApp;

   public DrawingBoard2(final MainApp2 mainApp) {
      this.mainApp = mainApp;
      JButton button = new JButton("Button");
      button.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            buttonActonPerformed();
         }
      });
      add(button);
   }

   private void buttonActonPerformed() {
      mainApp.mainAppMethod();

   }
}

別の推奨事項: Swing を学んでいるので、NetBeans を使用して Swing コードを生成するのではなく、Swing アプリケーションを手動でコーディングする方がはるかに優れています。これを行い、チュートリアルを学習することで、Swing の仕組みをより深く理解することができ、NetBeans コードジェネレーターを使用して最も単純なアプリケーション以上のものを作成する必要がある場合に役立ちます。

于 2011-02-23T03:35:03.673 に答える
1

Glowcoderの答えは良いです。もう 1 つのオプションは、mainApp をシングルトンにすることです (論理的に言えば、シングルトンの場合)。

于 2011-02-23T03:10:16.140 に答える