2

私のクラスはこんな感じです。

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

public class Painter extends JPanel {
    int x=200;
    int y=200;
    int newX;
    int newY;

    Painter(){
           setPreferredSize(new Dimension(400,400));
    }

    public void moveSquare(int newX, int newY){
           if(newY != y|| newX != x){
                repaint(x,y, 10, 10);
                y = newY;
                x = newX;
                repaint(x,y, 10, 10);
           }        
    }

    public void paintComponent(Graphics g){
           super.paintComponent(g);
           g.setColor(Color.BLACK);
           g.fillRect(x, y, 10, 10);
    }
}

メソッドは別のクラスから呼び出されます。xydoの値は、本来あるべき姿に変わります。しかし、正方形は動かない。ここで何か間違ったことをしましたか?

編集 はい、「スーパー」と呼んでいます。ここのコードをコピーして編集したときに誤って削除してしまいました。今それを編集して戻しました。

4

2 に答える 2

4

super.paintComponent(g)ではなく電話する必要がありますpaintComponent(g)

public void paintComponent(Graphics g) 

そうしないと、無期限にループします。

于 2012-08-27T22:49:35.047 に答える
2

呼び出しrepaint(x, y, w, h)は、選択した領域をダーティとして設定するだけです。Graphicsこの境界の周りにクリップを設定すると、そこでのみ変更が発生することがわかります。引数なしで使用repaint()すると、領域全体がダーティとしてマークされます:-)

AWT に関する Oracle の記事paint(ここにあります) によると、

AWT がこのメソッドを呼び出すと、Graphicsオブジェクト パラメーターは、この特定のコンポーネントを描画するための適切な状態で事前構成されます。

  • Graphics オブジェクトのは、コンポーネントのforegroundプロパティに設定されます。
  • Graphics オブジェクトのフォントは、コンポーネントのfontプロパティに設定されます。
  • Graphics オブジェクトの平行移動は、座標 (0,0) がコンポーネントの左上隅を表すように設定されます。
  • Graphics オブジェクトのクリップ四角形は、再描画が必要なコンポーネントの領域に設定されます。

これをテストするには、印刷してみてくださいg.getClip:-)

ヒントをあげる...

java.awt.Rectangle[x=0,y=0,width=10,height=10]
java.awt.Rectangle[x=0,y=0,width=10,height=10]
java.awt.Rectangle[x=0,y=0,width=10,height=10]

ここに固定がありmoveSquareます...

public void moveSquare(int newX, int newY){
  if (newY != y|| newX != x) {
    y = newY;
    x = newX;
    repaint();
  }        
}
于 2012-08-27T23:41:39.730 に答える