繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM