定时器与油漆组件

时间:2013-03-04 19:38:57

标签: java swing timer paintcomponent

我正在尝试在我的面板上绘制圆圈,但圆圈的颜色由一些参数决定。首先,圆圈应该涂成白色然后进入for循环检查哪个参数匹配并应该用该颜色绘制圆圈。圆圈的位置存储在一个数组中。我到目前为止所做的代码不起作用。我显然做错了什么,但我是java和编码的新手,所以我很困难。如果有人可以告诉我如何编辑/更改我的代码我会非常感激。 ArrayList circlesT是圆圈位置的arraylist,temp是具有值的数组,我也有参数。

public void paintComponent(Graphics g) {            
        drawShapes(g, circlesT);          
    }           

    public void drawShapes(Graphics g, final ArrayList<Shape> circlesT) {
        final Graphics2D ga = (Graphics2D) g;
        ga.drawImage(newImage, 0, 0, null);
        for (int i = 0; i < circlesT.size(); i++) {
            ga.draw(circlesT.get(i));
            ga.setPaint(Color.white);
            ga.fill(circlesT.get(i));
        }    
        Timer timer = new Timer();
        TimerTask t;
        t = new TimerTask() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) { 
                    if (read.temp.get(i) < 31 && read.temp.get(i) > 30) {
                        ga.draw(circlesT.get(i));
                        ga.setPaint(Color.green);
                        ga.fill(circlesT.get(i));
                    } else if (read.temp.get(i) < 32 && read.temp.get(i) > 31) {
                        ga.draw(circlesT.get(i));
                        ga.setPaint(Color.red);
                        ga.fill(circlesT.get(i));
                    } else if (read.temp.get(i) < 33 && read.temp.get(i) > 32) {
                        ga.draw(circlesT.get(i));
                        ga.setPaint(Color.yellow);
                        ga.fill(circlesT.get(i));
                    }                 
                }                    
            }
        };
        //repaint();
        timer.schedule(t, 0, 1000);    
    }

1 个答案:

答案 0 :(得分:3)

几点。

  • 在方法调用结束后,您不应该从Graphics保留paintComponent对象。
  • 一般情况下,您应使用javax.swing.Timer代替java.util.Timer
  • 您在计时器任务/操作中实际应该做的是更新数据状态并致电repaint
  • 执行所有绘画的代码应在paintComponent返回之前调用。