刚刚接触Swing事件派发线程,
对于“所有 Swing 组件及相关类都必须在事件调度线程上访问”这句话有点疑惑:
1. 比如类 TheButton 继承了 JButton , TheButton 有一些自定义的变量,当我对 TheButton 的自定义变量进行访问时,是不是也算是对 Swing 组件的访问。
2. 通过 getter 方法得到 TheButton 的自定义变量的值,也算“访问”吗?
3. 如果有段代码在事件派发线程外调用 getText() ,并且要根据返回的值来继续下去,是不是应该用 invokeAndWait()  String text;
public String getTheText() {
Runnable doRun = new Runnable() {
public void run() {
text = button.getText();
}
};
try {
SwingUtilities.invokeAndWait(doRun);
} catch (InterruptedException e) {

} catch (InvocationTargetException e) {

}
return text;
}上面写的代码正确吗?

解决方案 »

  1.   

    “所有 Swing 组件及相关类都必须在事件调度线程上访问”
    光是这句话,没有其它上下文,这句话是不对的!!!
    只有当组件"realized"后,组件的显示与某些属性相关,访问这些属性需要在Swing的EDT(Event dispatch thread)中。realized指的是调用Component的paint()方法后。
      

  2.   

    问题1,2:是访问Swing组件
    问题3:通过yourButton.getYourProperty()方法,获得了一个对象引用,然后,你在另外一个线程想去改变该对象的某些属性,这种情况下,需要保证在该行为是在EDT中发生,可以通过你所讲的调用EventQueue.invokeAndLater()或者另外一个方法.(你所说的例子,获得一个String对象的引用,在这里作为例子是不恰当的,拿到它,你又能够做什么事,从而影响Button的显示呢!!!)
      

  3.   

    谢谢你的回答,这下心里有谱了。
    关于我说的那个例子,我的代码中会去根据button.getText()的值来进行下一步操作,比如button.getText()里存的是一个路径,后面代码要根据获得的这个路径,执行打开文件的操作,并不去改变Button的显示