如何从外部调用gui嵌套在EventQueue invokeLater中?

时间:2016-01-10 01:01:09

标签: java multithreading thread-safety

如何从外部调用GUI元素。

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            gui = new NewJFrame().setVisible(true);
        }
    });

    gui.textarea.something;
}

1 个答案:

答案 0 :(得分:0)

我也认为这是一个XY问题。但是,要回答您提出的狭隘问题,请再次调用invokeLater()。我想也许问题可能只是需要存储变量gui以供日后使用。简单的答案是你只是将它存储为正常,但绝不能从除EDT之外的任何地方访问它。

public class MyApp {

   // Never access except from the EDT
   private static Object gui;

   public static void main(String args[]) {
     java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            gui = new NewJFrame().setVisible(true);
        }
    });

    // ... time passes ...


    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
           gui.textarea.something;
        }
    } );
  }
}

重新。你的评论:

如果你问的是模块,你可能正在寻找某种形式的依赖注入。一种方法是创建一个特殊的holder对象来保存应用程序的上下文信息。有很多方法可以做到这一点。这是一个简单的开始。更好的方法可能是使用更多,更小的上下文对象来引用应用程序的较小部分。

   public static void main(String args[]) throws Exception {
     GuiContext guic = new GuiContext();
     java.awt.EventQueue.invokeAndWait(new Runnable() {
        final GuiContext guiCtx = guic;
        public void run() {
            gui = new NewJFrame().setVisible(true);
            guiCtx.setMainFrame( gui );
        }
    });
    MyModule mod = new MyModule( guic );
    mod.startMessage();
}


public class MyModule  {
   private GuiContext gui;
   public MyModule( GuiContext gui ) { this.gui = gui; }
   public void startMessage() {
      gui.setMessage( "hello" );
   }
}

public class GuiContext {
   private Window gui;
   public setGui( Window gui ) { this.gui = gui; }
   public setMessage( final String message ) {
     java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            gui.add( message );
        }      
     } );
   }
}