java объект, который установлен в EventQueue.invokeLater, является нулем - PullRequest
1 голос
/ 27 июля 2011

У меня есть класс MyClass, который при запуске инициализирует AWT-кадр графического интерфейса (" Launch.java "), вызывая основной метод графического интерфейса. в этом основном методе у меня есть EventQueue.invokeLater, чей runnable фактически выполняет всю инициализацию. Одной из частей инициализации является установка объекта с именем " controller ".

После вызова основного метода GUI из MyClass, я хочу getController () контроллер, но он возвращает ноль, и я не знаю почему.

когда я отлаживал его, я помещал точку останова в Launch.java на строку, где создается контроллер ( controller = новый контроллер (textArea) ), и я заметил, что тогда он не равен нулю, но возвращается в MyClass значение null, когда я вызываю Launcher.getController () .

Что я делаю не так ?? Спасибо!

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 Ответ

1 голос
/ 27 июля 2011

Есть несколько проблем с вашим кодом.Наиболее ярким является то, что вы вызываете main(), а затем getControl() синхронно в потоке сервлета.Однако код, который создает контроллер, вызывается в какое-то неопределенное время в будущем, предполагая существование потока диспетчера AWT и очереди системных событий.В то время, когда вы вызываете getControl(), объект Launch, скорее всего, еще не был создан.

Предполагая, что остальная часть вашего кода делает то, что вы хотите, вам нужно просто переместить вызов getControl()прежде чем использовать его возвращаемое значение.

Я отвечаю только на вопрос, который вы задали ... однако дизайн вашего приложения (запуск приложения AWT из сервлета, отсутствующий код цикла событий AWT и т. д.) выглядитсомнительна.

...