我有一个MyClass类,当它运行时,通过调用GUI的main方法初始化GUI awt框架(“ Launch.java ”)。 在这个主要方法中,我有EventQueue.invokeLater,其runnable实际上完成了所有的初始化。初始化的一部分是设置一个名为“ controller ”的对象。
从MyClass调用GUI的main方法后,我想 getController()控制器,但它返回null,我不知道为什么。
当我调试它时,我在创建控制器的行上的Launch.java中放置了一个断点( controller = new Controller(textArea)),我注意到它不是null,但是回到MyClass,当我调用 Launcher.getController()时,它为null。
我做错了什么?谢谢!
MyClass的:
public class MyClass{
private static boolean isInitialized = false;
private Controller control;
public static void main(String[] args){
if (!isInitialized)
{
Launch.main(new String[1]);
control = Launch.getControl(); //here control is null!
isInitialized = true;
}
//irrelevant code here
}
}}
Launch.java:
public class Launch {
private JFrame frame;
private JTextField inputField;
DefaultListModel model;
private static Controller controller;
JSpinner spinner;
public static Controller getControl()
{
return controller;
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Launch window = new Launch();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Launch() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
//some code here... (here controller is null)
controller = new Controller(textArea);
//some code here... (here controller is not null - during debug)
}
}
答案 0 :(得分:1)
您的代码存在一些问题。最明显的是你在servlet线程上同步调用main()
然后getControl()
。但是,假设存在AWT调度程序线程和系统事件队列,则会在某些不确定的未来时间调用创建控制器的代码。在您调用getControl()
时,Launch对象很可能未被实例化。
假设代码的其余部分符合您的要求,您需要做的是将getControl()
的调用移到使用其返回值之前。
我只回答你问的问题......然而你的应用程序的设计(从servlet启动一个AWT应用程序,缺少的AWT事件循环代码等)看起来有点可疑。