isGUIInitialized () ложно, что теперь? - PullRequest
       15

isGUIInitialized () ложно, что теперь?

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

Я искал какой-то код и нашел людей, которые делают

 public static void main(String[] args) {
     new ExampleCode();
      }
 ExampleCode () {
      EventQueue.invokeLater(this);
    }

    public void run() {
        if (EventQueueMonitor.isGUIInitialized()) {
          guiInitialized();
        } else {
          EventQueueMonitor.addGUIInitializedListener(this);
        }
  }

Это имеет смысл, но теперь мой вопрос заключается в том, как они поддерживают выполнение кода. Насколько я понимаю, код идет в main ---> ExampleCode ---> Run и затем останавливается, потому что GUI не был инициализирован. Кто-нибудь из вызовов запускает GUI еще где? Я использую те же шаги в моей программе, но мой графический интерфейс не инициализирован.

Два моих примера кода:

http://java.sun.com/javase/technologies/accessibility/docs/jaccess-1.1/examples/Explorer/Explorer.java

http://www.java2s.com/Code/Java/Swing-JFC/AGUItoshowaccessibleinformationcomingfromthecomponentsinan.htm

Ответы [ 2 ]

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

В примере, который вы разместили, используются функции, связанные с доступностью, поэтому возможно, что инициализация может занять больше времени.Практика, которой мы следуем при использовании Swing, состоит в том, чтобы избежать тяжелой инициализации в очереди событий.Исходная логика автора заключается в том, что он ожидает полной инициализации свинга jframe и т. Д., А затем инициализирует свои собственные компоненты.

// Check to see if the GUI subsystem is initialized correctly. (This is needed in JDK 1.2 and higher). If it isn't ready, then we have to wait. 

  if (EventQueueMonitor.isGUIInitialized()) { 
    createGUI(); 
  } else { 
    EventQueueMonitor.addGUIInitializedListener(this); 
  } 
} 

public void guiInitialized() { 
  createGUI(); 
}

Фактическая логика инициализации записана в методе createGUI, который будет вызываться Swing или вашей собственной логикой.Ваша программа не прекратит работу, поскольку Swing использует собственный поток, не являющийся демоном (т. Е. Если вы не вызовете System.exit, ваша программа свинга не прекратит работу).

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

Вот простой пример, основанный на примерах из учебника по Swing:

import java.awt.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        add( new JLabel("Label") );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...