gpt4 book ai didi

java - actionPerformed(ActionEvent e) 是否在与事件调度线程 (EDT) 不同的线程中运行?

转载 作者:行者123 更新时间:2023-12-01 18:26:29 25 4
gpt4 key购买 nike

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 为什么创建框架 f 或将其设置为可见应该首先在 ETD 内完成?

最佳答案

问题不在于线程,而在于匿名 ActionListener 类只是一个不同的类。 ActionListener 的生命周期比局部变量“a”的生命周期长,因此您无法修改它。因此,它必须是最终的。

实际上,尝试“在构造函数中保留变量”然后允许生命周期较长的类修改它是完全没有意义的。

我相信最接近您想要的就是使“a”成为 Frame 类的成员变量。如果需要的话,您可以在 ActionListener 中使用“Frame.this.a”访问它,但在 Frame 中使用公共(public)方法会是更好的主意。

最后,创建框架并将其设置为“可见”是在 EDT 上完成的,因为这是唯一可以安全修改 Swing 组件的线程。

关于java - actionPerformed(ActionEvent e) 是否在与事件调度线程 (EDT) 不同的线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25983136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com