java在EventQueue.invokeLater中设置的对象为null

时间:2011-07-27 01:36:14

标签: java multithreading user-interface awt

我有一个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)
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。最明显的是你在servlet线程上同步调用main()然后getControl()。但是,假设存在AWT调度程序线程和系统事件队列,则会在某些不确定的未来时间调用创建控制器的代码。在您调用getControl()时,Launch对象很可能未被实例化。

假设代码的其余部分符合您的要求,您需要做的是将getControl()的调用移到使用其返回值之前。

我只回答你问的问题......然而你的应用程序的设计(从servlet启动一个AWT应用程序,缺少的AWT事件循环代码等)看起来有点可疑。