线程在执行倒计时时冻结UI

时间:2016-11-07 18:32:37

标签: java multithreading oop timer

我想用线程创建一个倒数计时器(这是我被告知要尝试的)。我确实制作了用户界面和所有但是一旦我添加了它冻结的线程。我尝试过使用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));
            }
        }
    }
);

2 个答案:

答案 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的基础知识。使用工作线程。