2011-09-23 34 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