事件发生时重绘功能不起作用

时间:2013-05-09 18:38:03

标签: java swing jbutton background-color thread-sleep

我想在事件发生时将按钮背景颜色更改10次?


private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        for (int i = 0; i < 10; ++i) {
            Random r = new Random();
            jButton2.setBackground(new Color(r.nextInt(150), r.nextInt(150), r.nextInt(150)));
            jButton2.repaint();
            Thread.sleep(200);
        }
    } catch (Exception e) {
        System.out.println(e.toString());
    }

}

按钮显示最后一种颜色


感谢它正常工作

int x = 0;
Timer timer;
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            Random r = new Random();
            jButton2.setBackground(new Color(r.nextInt(150), r.nextInt(150), r.nextInt(150)));
            jButton2.repaint();
            if(x==10){
                timer.stop();
                x=0;
            } else{
                x++;
            }
        }
    });
    timer.start();
}   

1 个答案:

答案 0 :(得分:3)

不要在Swing事件线程上调用Thread.sleep(...),因为这会使整个Swing GUI进入休眠状态。换句话说,您的GUI不会进行绘画,根本不接受任何用户输入或交互,并且在事件发生时变得完全无用(也称为 E vent D ispatch T hread或 EDT )。请改用Swing Timer。请查看Swing Timer Tutorial以获取更多帮助。

另请参阅this question的一些答案,包括mKo​​rbel的答案。