我的问题是我想将相同的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的任何帮助,都将受到赞赏。 谢谢!
答案 0 :(得分:1)
作为JavaDocs状态...
启动一个线程永远不合法。特别是,线程一旦完成执行就可能不会重新启动。
抛出:
IllegalThreadStateException-如果线程已经启动。
您不能两次start
Thread
。取而代之的是,从Runnable
开始,并在每次要运行时在其周围包裹一个新的Thread