我想用线程创建一个倒数计时器(这是我被告知要尝试的)。我确实制作了用户界面和所有但是一旦我添加了它冻结的线程。我尝试过使用Thread.yield()
,但它没有用。我试着用另一个问题看到的invokeLater()
技巧,但它不断给我convert void to Thread
。
在每次传递UI之后,应该更新JTextField。
field = new JTextArea();
Button = new JButton();
Button.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
for (int i = Integer.parseInt(field.getText()); i >= 0; i--)
{
try
{
Thread.sleep(1000);
}
field.setText(Integer.toString(i));
}
}
}
);
答案 0 :(得分:1)
您根本不使用线程。试试这个:
field = new JTextArea();
Button = new JButton();
Button.addActionListener
(
new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
new Thread() {public void run() {
for (int i = Integer.parseInt(field.getText()); i >= 0; i--)
{
try
{
Thread.sleep(1000);
}
field.setText(Integer.toString(i));
}
}}.start();
}
}
);
答案 1 :(得分:0)
“Swing事件处理代码在一个称为事件调度线程的特殊线程上运行。大多数调用Swing方法的代码也在这个线程上运行。这是必要的,因为大多数Swing对象方法都不是”线程安全的“:从多个线程调用它们会导致线程干扰或内存一致性错误。一些Swing组件方法在API规范中标记为“线程安全”;可以从任何线程安全地调用这些方法。必须从事件派发线程调用所有其他Swing组件方法忽略此规则的程序可能在大多数情况下正常运行,但会遇到难以重现的不可预测的错误。“ - 来自https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html
事件调度程序线程是swing的基础知识。使用工作线程。