2014-09-22 143 views
0

是否actionPerformed(ActionEvent e)运行在与事件派发线程(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()returnd在所有三种情况属实,这门槛是不可能做到内部actionPreformed A ++。

我调试了这个项目,并纠正我,如果我错了:所有虽然整个框架从EDT内运行,EDT启动新的不同线程为Frame()构造函数和actionPreformed()函数。然后,因此,为了避免actionPreformed()将使用另一个线程中创建的变量a,该变量可以在actionPreformed()的线程之前结束,它不可能有一个常规的'' int'',只允许'final int''。

因此,此示例中的actionPrefromed()函数是否在与Frame()构造函数的线程不同的线程中运行?

1.1如果不是,那么为什么不能在actionPreformed()函数中修改一个?

1.2如果是,那么我怎样才能存储可以保存在Frame()构造函数中的值?或者至少可以通过其他不同的按钮访问?

为什么创建框架f或将其设置为可视应该在ETD中首先完成?

+0

太多的问题......您的第一个问题与您的下列问题没有任何关系......您的第一个问题:ActionPerformed在edt中运行。 – Ben 2014-09-22 21:16:49

回答

4

这个问题不是线程,而是匿名的ActionListener类就是这样 - 一个不同的类。 ActionListener的生命周期比局部变量'a'的生命周期长,所以你不能修改它。因此,它必须是最终的。

对于你试图'在构造函数中保留一个变量',然后允许一个更长寿命的类来修改它,实际上是绝对没有意义的。

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

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

相关问题