gpt4 book ai didi

java - JFrame 在调整大小时重复绘图

转载 作者:行者123 更新时间:2023-12-02 07:34:03 24 4
gpt4 key购买 nike

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

public MyClass extends JPanel

代码非常简单(但很长),基本上添加了一些多边形,然后向每个多边形添加了一些点,然后将它们绘制在屏幕上(使用drawPolygon)。

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

 java.lang.OutOfMemoryError: Java heap space

此外,myPolygon.invalidate() 也没有帮助。

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

有人有解决办法吗?

重复的图像屏幕截图:1

最佳答案

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

}
}

关于java - JFrame 在调整大小时重复绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com