在For循环中使用Sleep方法(保持)

时间:2013-11-25 01:59:17

标签: java swing concurrency event-dispatch-thread

我正在制作一个在jTable中打印100个数字的程序。此外,将有一个if语句来验证结果,并将根据打印的值设置特定颜色的jPanel。我需要稍微打印这些值,并确保jPanel根据每个值更改颜色。我尝试了以下代码,但似乎有错误:

try{ 
  int n = 100;      
  int m = 1513;
  int a = 19713;
  double x = 177963;
  int c = 1397; 
  double r;     
  int i;

  Object[] res = new Object[n]; 

  for(i=0;i< n;i++){

    r = (a*x+c)%m;
    x = r;
    r = r/m;
    res[i] = r;
    Thread.sleep(1000);

    if(r>=0.3){
      jPanel3.setBackground(Color.green);                           
    }else{
      jPanel3.setBackground(Color.red);
    }
  }

  DefaultTableModel dtm = new DefaultTableModel();

  dtm.addColumn("Results", res);
  // dtm.addColumn("resultado2", res);
  jTable1.setModel(dtm);
}catch(Exception e){
  Thread.currentThread().interrupt();
}

2 个答案:

答案 0 :(得分:3)

  

但似乎有错误......

什么错误?

请注意,您永远不想在Swing应用程序的事件线程中调用Thread.sleep(...)。改为使用Swing Timer。

答案 1 :(得分:2)

Swing是一个单线程框架。 Event Dispatching Thread负责处理重绘请求等。任何阻止EDT运行的动作都会阻止它处理任何重新绘制请求和其他事件,使你的应用程序看起来像挂起......

您还需要确保所有UI更新都是在EDT的上下文中进行的。

在你的情况下,你正在执行一个循环并使用Thread.sleep,这是两个大的不,在处理Swing时没有...

查看Concurrency In Swing

正如您在duplicate question中所提到的,您应该使用javax.swing.Timer

这意味着您将不得不改变您的循环条件,例如......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ColorPane {

    public static void main(String[] args) {
        new ColorPane();
    }

    public ColorPane() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Color[] colors = new Color[]{Color.RED, Color.GREEN, Color.BLUE};
        private int colorIndex = -1;

        public TestPane() {
            Timer timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    colorIndex++;
                    if (colorIndex >= colors.length) {
                        colorIndex = 0;
                    }
                    setBackground(colors[colorIndex]);
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}