调整大小时,JFrame会复制图形

时间:2012-09-20 06:11:43

标签: java swing jframe jpanel out-of-memory

我用Java编写了一个代码(使用swing),它在面板上绘制了很少的多边形。

public MyClass extends JPanel

代码非常简单(但很长)并且基本上添加了很少的多边形,然后为每个多边形添加几个点,然后在屏幕上绘制它们(使用drawPolygon)。

我的问题是当我运行程序时,我看不到面板上的图纸。 过了一会儿,我发现当我重新调整框架的大小时,我可以突然看到图纸,但它会重复多次(取决于我重新调整大小)。如果我在调整大小时玩足够的时间,我会得到:

 java.lang.OutOfMemoryError: Java heap space

此外,myPolygon.invalidate()无效。

使用setResizable(false)时,根本无法看到我的绘图。

有没有人有解决方案?

重复图片屏幕截图:1

1 个答案:

答案 0 :(得分: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时翻译多边形
  4. 尝试这样的事情

    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();
    
        }
    }
    
相关问题