3

我的画布上有一个三个矩形。我想以一种缓慢的方式一个一个地改变三个矩形的颜色。例如:启动应用程序时,用户应该能够看到三个具有相同颜色(蓝色)的矩形。2 秒后,矩形颜色应变为红色。再次在 2 秒后,下一个矩形颜色应该会改变。最后一个也以相同的方式完成,这意味着在第二个矩形的 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);
                }*/


            }
4

2 回答 2

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();
于 2012-05-20T11:18:42.513 回答
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();
于 2012-05-20T11:23:07.507 回答