Java JFrame在调整大小时复制图形

Java JFrame在调整大小时复制图形,java,swing,jframe,jpanel,out-of-memory,Java,Swing,Jframe,Jpanel,Out Of Memory,我用Java编写了一个代码(使用swing),它在面板上绘制了几个多边形 public MyClass extends JPanel 代码非常简单(但很长),基本上只添加了几个多边形,然后向每个多边形添加几个点,然后在屏幕上绘制它们(使用drawPolygon) 我的问题是当我运行程序时,我看不到面板上的图形。 过了一段时间,我发现当我重新调整框架尺寸时,我可以突然看到这幅画,但它重复了很多次(取决于我重新调整了多少尺寸)。如果我有足够的时间调整大小,我会得到: java.lang.OutO

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

public MyClass extends JPanel
代码非常简单(但很长),基本上只添加了几个多边形,然后向每个多边形添加几个点,然后在屏幕上绘制它们(使用
drawPolygon

我的问题是当我运行程序时,我看不到面板上的图形。 过了一段时间,我发现当我重新调整框架尺寸时,我可以突然看到这幅画,但它重复了很多次(取决于我重新调整了多少尺寸)。如果我有足够的时间调整大小,我会得到:

 java.lang.OutOfMemoryError: Java heap space
另外,
myPolygon.invalidate()
也没有帮助

使用
setresizeable(false)
时,我根本看不到我的图形

有人有解决办法吗


重复图像截图:

首先,在您的
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);
    }
}
更新

所以,不管怎样,你正在做的其他有趣的事情是

  • 创建多边形的静态参照。希望您不打算一次在屏幕上显示更多;)
  • 向现有多边形添加新点(每次调用
    paintComponent
  • 每次调用
    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();
    
        }
    }
    

    为了更快地获得更好的帮助,请发布一个。我们可以看到更多的代码吗?你是否包含了super.paint(g)行?在编辑问题时,你能更小心一点吗?现在您已经两次删除了其他人所做的编辑@是的,是的。因为我没有足够的空间在这里写代码,所以这里有一个链接:Thanks@AndrewThompson对此很抱歉。谢谢@MadProgrammer,我删除了那些行,但仍然不起作用。我使用多边形的原因是我需要知道用户是否在多边形内单击,这是我无法使用BuffereImage的(形状不是正方形或矩形)。