Почему мое стандартное настольное Java-приложение JFrame использует EventQueue.invokeLater в основном методе? - PullRequest
4 голосов
/ 16 сентября 2011

Я использую новейшие Eclipse и GWT Designer, чтобы создать свинг-приложение на Java.Основная функция в моем окне приложения (которая является javax.swing.JFrame) в автоматически сгенерированных инструментами инструментах выглядит следующим образом:

    /* launch the application */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

Это похоже на большой шум вокруг того, что могло быть простоthis:

public static void main(String[] args) {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }


}

Я прочитал, что в некоторых ситуациях требуется метод EventQueue.InvokeLater, и другой вопрос: где его использовать здесь .

Мой вопроспроще;Почему это автоматически в генераторе кода здесь?Почему main должен быстро вернуться и позволить окну приложения позже создать очередь событий?Разве блокирование не было бы точно смыслом?Почему автоматически созданный дизайнер JFrame выполняет этот EventQueue?Я попытался увидеть некоторую разницу в запуске и показе форм, выполняется ли этот код более простым или более сложным способом, и я могу лишь временно сделать вывод, что это имеет некоторые преимущества, которые не видны в крошечных демонстрационных приложениях, созданных новичками.как я, и что, возможно, в реальных сложных комплексных классах, основанных на Jframe, есть какая-то выгода для этой стратегии задержки / очередей?

Ответы [ 2 ]

7 голосов
/ 16 сентября 2011

В зависимости от вашего приложения и того, как оно используется, возможно, что что-то рисует на экране (и, следовательно, использует EventQueue) до или во время вызова вашего main метода.Вызовы, которые изменяют любые компоненты пользовательского интерфейса, должны быть сделаны на Event Dispatch Thread, и это включает в себя настройку приложения видимым.

Поэтому, чтобы быть в безопасности, рекомендуется запускать ваше приложение на EDT.

Почему это происходит автоматически в генераторе кода здесь?

Это не повредит, его легко генерировать, и это считается хорошей практикой.

Почему main должен быстро вернуться и позволить окну приложения позже создать очередь событий?

Возможно, метод main вызывается из другого приложения, которое использует EDT и, возможно, уже что-то нарисовало на экране.Если вы рисуете ваше приложение непосредственно в main, возможно, ваше приложение может изменять какой-то компонент, который находится в процессе обработки чем-то в EDT и потенциально уже нарисован на экране.

Поэтому, чтобы быть в безопасности на случай, если такая ситуация когда-либо случится, вы должны оставить до EDT, чтобы нарисовать ваше приложение, чтобы оно могло делать это, когда оно не будет мешать чему-либо еще.

Разве блокировка не будет точной точкой?

Если что-то еще не вызывает main, кроме процесса JVM, который ваш пользователь запустил, дважды щелкнув значок на рабочем столе, этоничего не изменится, когда main вернется, пока на экране что-то есть.

Я могу лишь временно сделать вывод, что это имеет некоторые преимущества, которые не видны в крошечных демонстрационных приложениях, созданныхначинающие как я

Вы правы - в большинстве случаев это, вероятно, не будет иметь значения, но я предполагаю, что они включили его, потому что его было легко создавать и реализовывать, это не повредит,и это послужило бы примером хорошей практики.

2 голосов
/ 16 сентября 2011

1) почему строит Swing GUI внутри try-catch-finally, я не вижу никаких причин для этого, разделить создание не потокового GUI и не потокового кода на отдельные потоки,

2) Swing не является поточно-ориентированным, тогда правильным будет то, что pack() + setVisible(true) будет

  • последние строки кода, связанные с GUI

  • , завернутый в invokeLater

  • забыл о примерах из некоторого кода examplesDepots, этого форума, других форумов, уверен, что этот код работает, но с риском того, что все / что может произойти

  • правильный запуск Swing GUI

например

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            AppWindow window = new AppWindow();
            window.frame.setVisible(true);            
        }
    });
  }

3) есть ли некоторые Сериализуемые, Пользовательские L & F , затем (лучше будет) обернуть в invokeAndWait

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...