1

我想在延迟后一次将正方形添加到 jpanel 上。在我尝试使用 setBackgound() 更改背景颜色之前,我的程序运行良好。它没有改变。我发现我必须在我的 paintComponent 方法中调用 super.paintComponent(gr)。但是当我这样做并调用 repaint() 时,只显示当前方块。以前的方块消失了。我知道这是因为 repaint 每次都显示一个全新的面板但是为什么当我不调用 super.paintComponent() 时它会起作用。这是代码的简化版本:

import java.awt.*;
import javax.swing.*;

public class Squares extends JFrame{
    aPanel ap = new aPanel();   
    SlowDown sd = new SlowDown(); //slows down program by given number of milliseconds 

    public Squares(){
        super("COLOURED SQUARES");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(ap);
        ap.setPreferredSize(new Dimension(300, 300));
        pack();
        setVisible(true);
        addSquares();
   }

    private void addSquares(){
        sd.slowDown(500);
        ap.changeSquare( 100 , 100 , 255 , 0 , 0);
        ap.repaint();

        sd.slowDown(500);
        ap.changeSquare( 200 , 200 , 0 , 0 , 255);
        ap.repaint();     
   }



    public static void main(String[] arguments) {
        Squares sq  = new Squares();
    }


class aPanel extends JPanel{

    private int x = 0;
    private int y = 0;
    private int r = 0;
    private int g = 0;
    private int b = 0;  

    public void paintComponent(Graphics gr) {
        //super.paintComponent(gr);
        Color theColor = new Color (r, g, b);
        gr.setColor(theColor);
        gr.fillRect(x,y,30,30); 
    }
    void changeSquare(int i , int j, int rd , int gr , int bl){
        x = i;
        y = j;
        r = rd;
        g = gr;
        b = bl;
    }
}

class SlowDown{
    void slowDown(long delay){
         long t = System.currentTimeMillis();
         long startTime = t;
         while(t < startTime + delay){
             t = System.currentTimeMillis();            
         }
  }
}
}
4

1 回答 1

0

因此,您可以做很多事情来改进代码。首先,如果您想绘制多个矩形并“记住”这些矩形,那么您需要存储过去绘制的矩形。否则会发生什么,您基本上每次都在先前绘制的矩形上进行绘制。所以我建议将每个矩形存储在某种列表中。然后在绘画上,您可以遍历列表并绘制每个矩形。

其次,延迟可以通过 Thread.sleep() 调用来完成。也许这将是一个例子:

class APanel extends JPanel{

  List<Shape> rects;  
  private int r = 0;
  private int g = 0;
  private int b = 0; 

  public APanel(){
         rects = new ArrayList<Shape>();
  }

public void paintComponent(Graphics gr) {
    super.paintComponent(gr);
    Color theColor = new Color (r, g, b);
    gr.setColor(theColor);
    for(Shape s: rects){
       ((Graphics2D)gr).fill(s);
    }        
}

void changeSquare(int i , int j, int rd , int gr , int bl){
    rects.add(new Rectangle2D.Double(i, j, 30, 30));        
    //we have to deal with colors
}
}

现在,上面的示例将允许您不断地将新矩形添加到列表中,并且每次都绘制所有矩形。如果您需要用不同的颜色绘制每个矩形,那么您可能必须创建自己的矩形类来存储在列表中。至于延迟,您可以这样做:

 class SlowDown{
    void slowDown(long delay){          
       Thread.sleep(delay);
  }
 }

这应该暂停延迟毫秒。

于 2012-07-15T05:26:42.927 回答