2013-02-18 105 views
-1

我有一個GUI類命名爲NewFrame.java和另一個是Client.java。在Client.java中,NewFrame的對象是在一個線程內進行的。當然,java訪問類的變量在線程和使用外線程

public class ClientA { 

NewJFrame gui; 
int x ; 

public void go() { 
      java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       gui = new NewJFrame(); 
       gui.setVisible(true); 
       x = 10; 
      } 
     }); 

     System.out.println(x); // does not print 10 but it prints 0 

     gui.setTextboxvalue("value changed !!!"); 

     // can'se pass value to the function, with this error occurs as, 
     // "java.lang.NullPointerException" at here. 

     } 
} 

這裏有兩個問題存在的, 有名爲setTextboxValue但調用此如圖所示的錯誤發生以上情況「顯示java.lang.NullPointerException」 newFrame的類的setter方法。

的另一個問題是:爲什麼不能設置變量x該線程內,設置該內螺紋,外面印刷的可變x值,它是代替它打印0

+0

*「我有一個貴族班,叫..」*你有換檔鍵嗎?這應該是*「我有一個叫做..」的GUI類。將來會有更多的努力。 – 2013-02-18 22:17:35

+0

問題根據你的願望更新! – 2013-02-19 05:52:40

回答

2

10不打印有EventQueue.invokeLater在單獨的線程上調用其方法,在事件調度線程上的所有其他任務完成後,在事件調度線程上異步觸發它。換句話說,run()方法內的代碼很可能在方法完成後執行。因此,gui變量仍然爲空,導致在調用gui.setTextboxvalue時產生NullPointerException;當你打印出這個值時x仍然是0。

+0

那麼訪問它的解決方案是什麼? – 2013-02-18 18:25:23

+0

您可以在主線程中創建NewJFrame實例,也可以在初始化NewJFrame實例後執行事件派發線程中的其他工作。 – 2013-02-18 18:27:08

+1

'java.awt.EventQueue.invokeLater'下的代碼是使用netbeans自動生成的,我認爲它不適合初始化java.awt.EventQueue.invokeLater中的gui類.. – 2013-02-18 18:32:31