![](/img/trans.png)
[英]create new thread inside actionPerformed and Event Dispatch Thread (EDT) issue
[英]Does actionPerformed(ActionEvent e) runs in a different thread than the Event Dispatch Thread (EDT)?
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内部执行++是不可能的。
我调试了这个项目,如果我错了,请纠正我:尽管整个框架都在EDT中运行,但EDT为Frame()构造函数和actionPreformed()函数启动了新的不同线程。 然后,因此,为了避免actionPreformed()的可能性,将使用在另一个线程中创建的变量a,该变量可能在actionPreformed()的线程之前结束,因此不可能将a作为常规的'' int”,仅允许“ final int”。
1那么,此示例中的actionPrefromed()函数是否在与Frame()构造函数的线程不同的线程中运行?
1.1如果没有,那么为什么不能在actionPreformed()函数中进行修改?
1.2如果是,那么我如何存储可以保存在Frame()构造函数中的值? 或者至少可以通过其他不同的按钮访问?
2为什么首先要在ETD内创建框架f或将其设置为可见?
问题不在于线程,而是匿名的ActionListener类就是另一个类。 ActionListener的生存期长于局部变量'a'的生存期,因此您无法对其进行修改。 因此,它必须是最终的。
实际上,尝试“在构造函数中保留变量”,然后允许寿命更长的类对其进行修改,对于您来说绝对没有任何意义。
我相信,最接近您想要的是使“ a”成为Frame类的成员变量。 然后,可以根据需要在ActionListener中使用“ Frame.this.a”访问它,但是在Frame中使用公共方法会是一个更好的主意。
最后,在EDT上完成创建框架并将其设置为“可见”的操作,因为这是唯一可以安全地修改Swing组件的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.