1

3つのクラスがあるアプリを作ろうとしています。Controlller(メインクラス)、SerialHandler、およびNetBeansGuiBuilderで作成されたJFrameフォームであるMainWindow。

public class Controller {
    SerialHandler serialHandler;
    MainWindow mainWindow;
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        // TODO code application logic here
        Controller controller = new Controller();
        controller.initializeSystem(controller);
    }
    public void initializeSystem(Controller _controller){
        mainWindow = new MainWindow(_controller);
        mainWindow.setVisible(true);
    }
    public void anotherMethod(){
        mainWindow.setMyLabelText("Hello");
    }
}

したがって、問題は、そのようにして、SerialHandlerクラスからのイベントがanotherMethod()を呼び出す場合、setMyLabelTextメソッドは機能しませんが、initializeSystem()から呼び出す場合です。できます。

ここで、メイン内でメインウィンドウを宣言すると、mainWindowインスタンスはanotherMethod()から表示されません。

mainWindowオブジェクトをmainの外部で宣言し、そのメソッドをmainコンテキストから使用しようとすると、mainWindowオブジェクトが非静的コンテキストの外部で宣言されているため、使用できません。

誰かが私を助けてくれますか、少なくとも私を正しい方向に向けることができますか?

ありがとう!

4

1 に答える 1

2

コードに設計上の不整合があります。

   public static void main(String[] args) {
        // TODO code application logic here
       Controller controller = new Controller();
       controller.initializeSystem(controller);
   }
   public void initializeSystem(){
       mainWindow = new MainWindow(_controller);
       mainWindow.setVisible(true);
   }

引数として渡すコントローラーを作成していますが、これは内部initializeSystemで使用できるので不要です。thisinitializeSystem

代わりにこれを行う必要があります。

   public static void main(String[] args) {
        // TODO code application logic here
       Controller controller = new Controller();
       controller.initializeSystem();
   }
   public void initializeSystem(Controller _controller){
       mainWindow = new MainWindow(this);
       mainWindow.setVisible(true);
   }

2番目の不整合は、anotherMethodUIにアクセスしてその中のコンテンツを更新するメソッドです。代わりに、それをコントローラーに任せる必要があります。このようなもの:

public class Controller {
     //...

     public void updateUIText(String text){
           SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                mainWindow.setMyLabelText("Hello");
              }
           });
     }
}

これで、SerialHandler必要に応じてコントローラーを介してUIを更新できます。あなたがしなければならないのは、へのController参照を渡すことですSerialHandler

編集SwingUtilities.invokeLater私はUIを更新するためにを使用したことに注意してください。これControllerにより、マルチスレッドのシナリオでもUIが正しく更新されるようになります。

于 2012-07-05T20:15:41.517 に答える