2013-02-18 66 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