Java如何线程化GUI

时间:2016-08-07 11:07:53

标签: java multithreading swing event-dispatch-thread

所以我有一个按钮打开一个while循环,然后我的整个GUI冻结,直到while循环结束,据说如何将我的GUI线程每隔一秒更新一次?

JButton Test= new JButton();
Test.setText("Test");
Test.setSize(230, 40);
Test.setVisible(true);
Test.setLocation(15, 290);

Test.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e){
int x = 0;
while(x<500){
    x++
});

3 个答案:

答案 0 :(得分:3)

最大的想法是你的GUI冻结,因为你正在负责绘制GUI的线程中进行大量处理;解决方案是委托计算或任何易于花时间处理将在后台执行的线程的处理。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

答案 1 :(得分:2)

这很明显,因为Swing对象不是线程安全的,所以你提供了SwingUtilities.invokeLater(),这允许在稍后的某个时间点执行任务。

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      int x = 0;
      while(x<500){
          x++
      }
    }
});

答案 2 :(得分:1)

使用ExecutorService

Test.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            ExecutorService es = Executors.newCachedThreadPool();
            es.submit(new Runnable() {
                @Override
                public void run() {
                    int x = 0;
                    while (x < 500) {
                        x++;
                    }
                }
            });
        }
 });