Java JFrame在调整大小时复制图形
我用Java编写了一个代码(使用swing),它在面板上绘制了几个多边形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
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的(形状不是正方形或矩形)。