1

少し遅れて、jpanelに正方形を1つずつ追加したい。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
}
}

上記の例では、リストに新しい四角形を継続的に追加し、そのたびにすべての四角形をペイントできます。各長方形を異なる色でペイントする必要がある場合は、List に格納する独自の長方形クラスを作成する必要がある場合があります。遅延に関しては、これを行うことができます:

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

そして、それは遅延ミリ秒の間物事を一時停止するはずです.

于 2012-07-15T05:26:42.927 に答える