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. 创建对多边形的静态引用。希望您不打算一次在屏幕上显示更多;)
  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 回答