0

パネルにいくつかのポリゴンを描画するコードをJavaで(swingを使用して)作成しました。

public MyClass extends JPanel

コードは非常に単純で(ただし長い)、基本的にいくつかのポリゴンを追加し、次に各ポリゴンにいくつかのポイントを追加してから、それらを画面に描画します(を使用drawPolygon)。

私の問題は、プログラムを実行すると、パネルに図面が表示されないことです。しばらくすると、フレームのサイズを変更すると、突然図面が表示されますが、何度も複製されます(サイズを変更した量によって異なります)。サイズ変更で十分な時間を費やすと、次のようになります。

 java.lang.OutOfMemoryError: Java heap space

また、myPolygon.invalidate()助けにはなりません。

使用してsetResizable(false)いると、自分の絵がまったく見えません。

誰かが解決策を持っていますか?

複製画像のスクリーンショット:1

4

1 に答える 1

2

まず、paintComponentメソッドで呼び出さないでください

setPreferredSize(new Dimension(500,500));
setVisible(true);
validate();

これにより、再描画が要求paintComponentされ、リコールが発生し、厄介なループに陥り、CPU と (ご存知のように) メモリが消費されます。

それを回避できる場合は、ポリゴンをバッファーに描画し、 の各反復でバッファーを画面に描画することをお勧めしますpaintComponent。これは、長期的にはより高速になります...

// Create a field
private BufferedImage buffer;

// Call this when you need to change the polygon some how...
protected void createBuffer() {

    // You need to determine the width and height values ;)
    buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = image.createGraphics();

    int xoffset=5;//Multiply in order to "zoom" the picture
    int offset=0;//moves shape to the right

    p.addPoint(40*xoffset-offset, 30*xoffset-offset);
    p.addPoint(50*xoffset-offset,30*xoffset-offset);
    p.addPoint(57*xoffset-offset,37*xoffset-offset);
    p.addPoint(57*xoffset-offset,47*xoffset-offset);
    p.addPoint(50*xoffset-offset,54*xoffset-offset);
    p.addPoint(40*xoffset-offset,54*xoffset-offset);
    p.addPoint(33*xoffset-offset,47*xoffset-offset);
    p.addPoint(33*xoffset-offset, 37*xoffset-offset);

    g.drawPolygon(p);
    g.dispose();

}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (buffer != null) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(buffer, translateX, translateY, this);
    }
}

アップデート

とにかく、あなたがしている他の楽しいことは...

  1. Polygon への静的参照を作成します。一度に複数の画面を表示するつもりはなかったと思います ;)
  2. 既存のポリゴンに新しいポイントを追加します (paintComponent呼び出されるたびに)
  3. paintComponent呼び出されるたびにポリゴンを変換する

代わりにこのようなことを試してください

public class RoundTop extends JPanel {

    //Polygons declarations
    private Polygon p = new Polygon();
    //Translate variables;
    private int translateX = 10;
    private int translateY = 10;

    public RoundTop() {

        int xoffset = 5;//Multiply in order to "zoom" the picture
        int offset = 0;//moves shape to the right

        p.addPoint(40 * xoffset - offset, 30 * xoffset - offset);
        p.addPoint(50 * xoffset - offset, 30 * xoffset - offset);
        p.addPoint(57 * xoffset - offset, 37 * xoffset - offset);
        p.addPoint(57 * xoffset - offset, 47 * xoffset - offset);
        p.addPoint(50 * xoffset - offset, 54 * xoffset - offset);
        p.addPoint(40 * xoffset - offset, 54 * xoffset - offset);
        p.addPoint(33 * xoffset - offset, 47 * xoffset - offset);
        p.addPoint(33 * xoffset - offset, 37 * xoffset - offset);

        p.translate(translateX, translateY);

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g.create();

        g2d.drawPolygon(p);

        g2d.dispose();

    }
}
于 2012-09-20T06:41:58.487 に答える