Инициализация Java Swing в фоновом режиме - PullRequest
0 голосов
/ 14 августа 2010

У меня вопрос по поводу быстрой инициализации компонентов свинга. В начале моего приложения Swing у меня появляется окно с кнопками, которые позволяют пользователю делать разные вещи. Есть ли способ, которым я могу быстро запустить это первое окно и загрузить остальную часть пользовательского интерфейса (например, другие фреймы и диалоги) в фоновом режиме, чтобы не было такой начальной задержки.

Спасибо

Ответы [ 5 ]

1 голос
/ 25 июля 2012

Сначала отобразите пустой основной кадр, а затем загрузите оставшуюся часть интерфейса.Вы можете использовать Swing Application Framework (или BSAF сейчас) для инициализации компонентов и построения макета, когда приложение готово (основной кадр виден) - метод Application.ready ()Используйте http://code.google.com/p/jbusycomponent/, чтобы показать, что приложение загружается ...

1 голос
/ 14 августа 2010

Безопасна ли нить Swing?

1 голос
/ 14 августа 2010

Да. Иш. Вы можете сделать что-то похожее на:

public static void main(String [] args) {
    // Construct main Frame on Swing EDT thread
    Runnable goVisible = new Runnable() {
        public void run() {
             JFrame mainFrame = new JFrame();
             mainFrame.setVisible();
             // etc.
        }
     };

     SwingUtilities.invokeLater(goVisible);

     // now the background init stuff
     Class.forName("com.yourcompany.view.Dialog1");
     Class.forName("com.yourcompany.view.WizardGUI");
     Class.forName("com.yourcompany.view.SecondaryFrame");

     // Here all the views are loaded and initialized
 }
0 голосов
/ 14 января 2012

Это цель использования Splash Screen (с индикатором прогресса или без него - гораздо приятнее с ним, конечно).Вы должны показать хороший всплеск своим пользователям, а затем инициализировать все свои компоненты, начиная с главного окна в потоке EDT и в конце вы показываете свой фрейм.Создание компонентов Swing за пределами EDT может (это обязательно будет) создавать проблемы, по крайней мере, с видимостью, а также с одновременным доступом между вашим потоком и EDT. НЕ сделать это, трудно обнаружить эти проблемы, и это может проявляться случайным образом на другом оборудовании.

Конечно, если у вас есть индикатор выполнения, вам нужно некоторое время EDT для рендерингаИзменения индикатора выполнения - фактически даже для обновления самого экрана-заставки (перекраска фонового изображения, если другое приложение на время заблокировало ваш всплеск), вам нужно свободное время на EDT.запуск не займет более 500 мс, и вы запланируете их на EDT с помощью SwingUtilities.invokeLater.

0 голосов
/ 14 августа 2010

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

Есть две части для загрузки класса.

  1. JVM загружает файл класса в ClassLoader, когда это необходимо.
  2. JIT компилирует и оптимизирует кодировать при первом запуске пути.

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

Чтобы избежать некоторых неприятностей, которые вы получаете с помощью подхода отражения. Один из способов, который вы можете попробовать, - это убедиться, что конструктор не отображает окно, в вашем окне есть другой метод, который будет отображать окно, называемое init (). Затем создайте новый поток из основного вызова для каждой из Windows, которую вы используете. хочу предварительно загрузить.
Не сохраняйте ссылку на окно.

В реальном коде вы вызываете конструктор, а затем init () для каждого окна, которое хотите отобразить. Это даст вам наилучший из возможных сценариев с точки зрения производительности, потому что теперь вы загружаете классы и запускаете код конструктора. Конечно, размер программы в памяти будет раздутым.

public static void main(String [] args) {
    // Construct main Frame on Swing EDT thread
    Thread thread = new Thread() {
        public void run() {
          // now the background init stuff
          new com.yourcompany.view.Dialog1();
          new com.yourcompany.view.WizardGUI();
          new com.yourcompany.view.SecondaryFrame();
         // Here all the views are loaded and initialized
        }
     };

     JFrame mainFrame = new JFrame();
     mainFrame.setVisible();
     // etc.
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...