我用Java编写了一个代码(使用swing),它在面板上绘制了很少的多边形。
public MyClass extends JPanel
代码非常简单(但很长)并且基本上添加了很少的多边形,然后为每个多边形添加几个点,然后在屏幕上绘制它们(使用drawPolygon
)。
我的问题是当我运行程序时,我看不到面板上的图纸。 过了一会儿,我发现当我重新调整框架的大小时,我可以突然看到图纸,但它会重复多次(取决于我重新调整大小)。如果我在调整大小时玩足够的时间,我会得到:
java.lang.OutOfMemoryError: Java heap space
此外,myPolygon.invalidate()
无效。
使用setResizable(false)
时,根本无法看到我的绘图。
有没有人有解决方案?
重复图片屏幕截图: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);
}
}
<强>更新强>
所以,无论如何,你正在做的其他有趣的事情是......
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();
}
}