0

確かに、これは非常にばかげた標準的な問題のようなものですが、これを検索して修正しようと何時間も費やしましたが、うまくいきません...ここで間違いを見つけることができません...

JComponent に何かを出力する単純なプログラムを作成しようとしています。paintComponent() メソッドはいくつかの変数を参照しており、私がそう言うなら、JComponent のみを再描画したいのです! しかし、変数を変更するたびに常に再描画されます...

私の2つのクラスのコードは次のとおりです。

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

public class SimplePaint extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private PaintingCanvas pc;


public SimplePaint() {

    super("SimplePaint");

    this.pc = new PaintingCanvas();
    this.pc.setPreferredSize(new Dimension(800, 600));


    this.add(pc);
    this.setResizable(false);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.pack();
    this.setVisible(true);
    this.setLocationRelativeTo(null);

}


public static void main(String[] args) {

    SimplePaint sp = new SimplePaint();

    sp.pc.setxStart(50);
    sp.pc.setyStart(60);
    sp.pc.setxEnd(140);
    sp.pc.setyEnd(300);

}



}

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

public class PaintingCanvas extends JComponent {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private int xStart, yStart;
private int xEnd, yEnd;

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;

    g2d.fillRect(xStart, yStart, xEnd, yEnd);
}

/**
 * @param xStart the xStart to set
 */
public void setxStart(int xStart) {
    this.xStart = xStart;
}

/**
 * @param yStart the yStart to set
 */
public void setyStart(int yStart) {
    this.yStart = yStart;
}


/**
 * @param xEnd the xEnd to set
 */
public void setxEnd(int xEnd) {
    this.xEnd = xEnd;
}

/**
 * @param yEnd the yEnd to set
 */
public void setyEnd(int yEnd) {
    this.yEnd = yEnd;
}

}

表示されるもの: 長方形のキャンバス (50、60、140、300)...

表示する必要があるもの: 空白のキャンバス。次に sp.pc.repaint() またはそのようなものをメイン メソッドに配置すると、再描画して四角形を表示する必要があります...

4

1 に答える 1

3

いつ、何回paintComponent呼び出されるかを推測することはできません。フレームを可視化すると、呼び出されます。また、フレームを最大化する場合など... がpaintComponent呼び出される状況はたくさんあります。

解決策は非常に簡単です。

  • クラスにフラグ ( boolean drawRectangle = false;)を追加しますPaintingCanvas
  • paintComponentフラグの値を確認し、それに応じて長方形を描画します (または描画しません) 。
  • 長方形を表示する場合は、フラグの値を切り替えます
于 2013-05-17T13:07:34.783 に答える