2011-09-23 33 views
2

我一直在寻找一些代码,我找人做isGUIInitialized()是false,现在怎么办?

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?我在我的程序中使用了相同的步骤,但是我的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

+1

我从来没有见过(或使用过)这样的代码示例。我从我的代码示例[Swing教程](http://download.oracle.com/javase/tutorial/uiswing/TOC.html)从不检查EventQueueMonitor。 – camickr

+0

你有什么想法,为什么有人会麻烦检查EventQueueMonitor?不是100%确定,但我认为需要检查是否要与另一个Java客户端交互。 – Juan

+0

@Juan您发布的链接在评论中有详细的理由。它还实现了GuiinitializedListener,当Swing停止初始化时,将调用此接口的方法。 –

回答

2

您发布的例子是使用与可访问性相关的功能,因此初始化可能需要更多时间。我们在使用Swing时遵循的做法是为了避免对事件队列进行过多的初始化。原作者的逻辑做的是他等待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,你的swing程序不会终止)。

+0

好吧,我想这听起来真的很愚蠢。我的理解是,在我的createGUI()中,我将创建所有的GUI组件,添加JLabel,JPanel等。似乎我需要使用具有这段代码的相同方法来完成它。我现在不明白的是我应该在createGUI()方法中写入什么类型的代码。在这个例子中有一个监听器,但之前也有一个监听器。不知道为什么createGUI现在存在。 – Juan

+1

您的困惑是有效的。这个特殊的例子是在你开始添加你自己的JLabel,JPanel等之前等待Swing初始化它的所有底层资源。如果你看看Sun的例子,它就更清楚了。构造函数检查Swing自己的系统是否已初始化(如果是),调用初始化逻辑,如果不是,则使用Swing事件队列注册侦听器,这样当Swing完成初始化时,它会调用侦听器方法(在您的类中定义),这又将调用createGUI。 –

+1

这里是我的建议,使用或不使用EventQueue技术调用CreateGUI,很可能你不会感觉到任何区别。 EventQueue技术的用法是在尝试添加“辅助”组件之前给JVM/Swing一个完全初始化的机会。 –

2

这是基于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(); 
      } 
     }); 
    } 
} 
+0

安慰,即使你还没有看到一切:-) @Usman萨利姆评论是正确的现货,并很好地解释 – kleopatra

+0

@kleopatra,有很多我没有看到的东西。我相信你已经忘记了比我知道的更多:) – camickr