【发布时间】:2014-09-23 05:21:37
【问题描述】:
actionPerformed(ActionEvent e) 是否在与事件调度线程 (EDT) 不同的线程中运行? 假设我写了以下代码:
public void main(String args[]){
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Frame f = new Frame();
f.setVisible(true);
javax.swing.SwingUtilities.isEventDispatchThread()
}
catch(Exception e){ e.printStackTree;}
}
public Frame()
{ //...some code....
JButton btn = new JButton();
//int a;
javax.swing.SwingUtilities.isEventDispatchThread()
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//..some code....
javax.swing.SwingUtilities.isEventDispatchThread()
//a++;
}
}
}
虽然运行 javax.swing.SwingUtilities.isEventDispatchThread() 在所有三种情况下都返回 true,但在 actionPreformed 中执行 a++ 是不可能的。
我调试了这个项目,如果我错了,请纠正我:尽管整个框架是在 EDT 内运行的,但 EDT 为 Frame() 构造函数和 actionPreformed() 函数启动了新的不同线程。然后,正因为如此,为了避免 actionPreformed() 将使用在另一个线程中创建的变量 a 可能在 actionPreformed() 的线程之前结束,它不可能将 a 作为常规 '' int'',只允许''final int''。
1 那么本例中的 actionPrefromed() 函数是否在与 Frame() 构造函数的线程不同的线程中运行?
1.1 如果不是,那为什么不能在 actionPreformed() 函数中修改 a 呢?
1.2 如果是,那么我如何存储可以保存在 Frame() 构造函数中的值?或者至少可以通过其他不同的按钮访问?
2 为什么首先要在 ETD 内部创建框架 f,或者将其设置为可见?
【问题讨论】:
-
太多问题...您最初的问题与您的以下问题无关...对于您的第一个问题:ActionPerformed 在 edt 中运行。
标签: java swing event-dispatch-thread