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

Java actionPerformed(ActionEvent e)是否在与事件调度线程(EDT)不同的线程中运行?,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,actionPerformed(ActionEvent e)是否在与事件调度线程(EDT)不同的线程中运行? 假设我编写了以下代码: public void main(String args[]){ EventQueue.invokeLater(new Runnable() { public void run() { try { Frame f = new Frame();

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为什么要创建帧f,或者首先在ETD内部将其设置为可见

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

实际上,尝试“在构造函数中保留一个变量”,然后允许一个寿命更长的类修改它,这对您来说是完全没有意义的

我相信最接近您想要的是将“a”作为Frame类的成员变量。如果必须的话,您可以在ActionListener中使用“Frame.this.a”访问它,但最好在Frame中使用公共方法


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

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

实际上,尝试“在构造函数中保留一个变量”,然后允许一个寿命更长的类修改它,这对您来说是完全没有意义的

我相信最接近您想要的是将“a”作为Frame类的成员变量。如果必须的话,您可以在ActionListener中使用“Frame.this.a”访问它,但最好在Frame中使用公共方法


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

问题太多…您的初始问题与以下问题无关…到您的第一个问题:操作在EDT中运行。问题太多…您的初始问题与以下问题无关…到您的第一个问题问题:ActionPerformed在edt中运行。