IllegalStateException:同一线程,不同源(GUI)

时间:2018-10-21 00:50:32

标签: java multithreading swing actionlistener illegalstateexception

我的问题是我想将相同的ActionListener添加到GUI程序的2个不同组件中。一种是在用户按下JTextField中的 Enter 键时,另一种是在用户单击JButton时。我正在使用Netbeans IDE。

因此,我创建了一个线程t1,然后在actionListener的actionPerformed方法中,只需放入 t1.start()。然后,将actionListener对象添加到JTextField和JButton中。 运行程序时,第一次单击按钮或按 Enter 时,程序运行平稳。但是第二次我单击按钮或按 Enter 时,程序将引发 IllegalStateException 。 这是我的代码:

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            //Do something
        }
     });
    public final ActionListener listener;

    public myClass () {    //Constructor 
        this.listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t1.start();
            }
        };
    InitComponents();
    JButton.addActionListener(listener);      //Adding listener object to JButton.
    JTextField.addActionListener(listener);   //Adding listener object to JTextField.
    }

我认为,即使 run()方法已经退出,但从我第一次单击或按 Enter 时线程就不会“死”。我在不同点测试了该程序,以确保 run()方法确实退出。

如果我同时在 JButtonActionPerformed( JTextFieldActionPerformed()方法中创建一个线程,并在这些方法本身中启动它们,那么我就能使程序正常工作。多余,因为我正在用两种不同的方法编写相同的动作。

对于为什么抛出IllegalStateException异常以及如何使用线程为两个JComponent创建单个ActionListener的任何帮助,都将受到赞赏。 谢谢!

1 个答案:

答案 0 :(得分:1)

作为JavaDocs状态...

  

启动一个线程永远不合法。特别是,线程一旦完成执行就可能不会重新启动。   

抛出:
  IllegalThreadStateException-如果线程已经启动。

您不能两次start Thread。取而代之的是,从Runnable开始,并在每次要运行时在其周围包裹一个新的Thread