矩形着色逻辑

时间:2012-05-20 11:16:26

标签: java swing graphics swt

我的画布上有三个矩形。我想改变三个矩形的颜色 以缓慢的方式一个接一个地。 例如:启动应用程序时,用户应该能够看到三个颜色相同的矩形(蓝色)。 2个secons后,矩形颜色应变为红色。 在2个secons之后,下一个矩形颜色应该改变。 最后一个也是以相同的方式完成,这意味着在第二个矩形的2秒之后。

我以自己的方式写作。但它没有用。所有的矩形都一起改变。我想一个接一个。

任何人都可以给我逻辑。

final Runnable timer = new Runnable() {

        public void run() {


            //list of rectangles size =3; each contain Rectangle.
            for(int i = 0 ; i < rectangleList.size();i++){

                if(rectangleListt.get(i).getBackgroundColor().equals(ColorConstants.blue)){
                    try {

                        rectangleList.get(i).setBackgroundColor(ColorConstants.yellow);
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    //rectSubFigureList.get(i).setBorder(null);
                }/*else{
                    rectSubFigureList.get(i).setBackgroundColor(ColorConstants.blue);
                }*/


            }

2 个答案:

答案 0 :(得分:4)

你可能在Swing的事件线程或EDT(用于事件调度线程)中调用Thread.sleep,这将导致线程本身进入休眠状态。由于此线程负责Swing的所有图形和用户交互,这实际上会使您的整个应用程序进入休眠状态,而不是您想要发生的事情。相反,请阅读并使用Swing Timer进行此操作。

参考文献:

要扩展Hidde的代码,您可以这样做:

// the timer:     
Timer t = new Timer(2000, new ActionListener() {
     private int changed = 0; // better to keep this private and in the class
     @Override
     public void actionPerformed(ActionEvent e) {
        if (changed < rectangleList.size()) {
            rectangleList.setBackgroundColor(someColor);
        } else {
            ((Timer) e.getSource()).stop();
        }
        changed++;
     }
 });
 t.start();

答案 1 :(得分:3)

您可以设置定时器:

    // declaration: 
    static int changed = 0;

    // the timer:     
    Timer t = new Timer(2000, new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
                // Change the colour here:
                if (changed == 0) {
                  // change the first one
                } else if (changed == 1) {
                  // change the second one
                } else if (changed == 2) {
                  // change the last one
                } else {
                  ((Timer) e.getSource()).stop();
                }
                changed ++;

          }
     });
     t.start();