JPanel 图形清除和重绘?
Posted
技术标签:
【中文标题】JPanel 图形清除和重绘?【英文标题】:JPanel Graphics clearing and repainting? 【发布时间】:2011-10-17 16:22:20 【问题描述】:我有一个 JPanel
和一个 paintComponent()
函数。我会调用一次,然后当用户单击不同的JButton
时,我会设置一些标志并想再次调用此函数,因为在设置标志后它会做一些稍微不同的事情。
所以这就是我想知道的:我如何从paintComponent
中清除现有的东西?要重绘,我是否只需再次调用paintComponent
?
目前我正在尝试以下方法:
flag2 = true;
repaint(); //I expect (want) paintComponent to be called again
在绘画组件中,我做的事情如下:
if (flag2==true)
g.drawRect(...);
else
g.drawLine(...);
但是通过测试,我的工作似乎有问题。
感谢您的帮助。
【问题讨论】:
你不是从paintComponent方法中调用repaint(),是吗?您确定 repaint() 调用与您要刷新的面板相关联吗? (例如 myPanel.repaint())? 【参考方案1】:要清除所有先前绘制的图形,请调用g.clearRect(0, 0, getWidth(), getHeight())
。
【讨论】:
【参考方案2】:我建议调用 revalidate();而不是重绘()。 revalidate() 需要在更改大小/布局或在 jpanel 上添加/删除对象时调用,并将更新它的所有子项。据我所知,您仍在使用相同的绘制对象,但更改了它的布局。
【讨论】:
【参考方案3】:当您更改面板的属性时,您需要调用:
panel.repaint();
使组件被重新绘制。
那么paintComponent()方法中的第一条语句应该是:
super.paintComponent(g);
这将绘制背景,因此您现在可以进行自定义绘制。
如果您需要更多帮助,请发布您的 SSCCE 来说明问题。
【讨论】:
【参考方案4】:首先,为什么不使用枚举而不是布尔值?
enum Enum
RECTANGLE,
LINE,
CIRCLE
Enum choice = RECTANGLE; //default to RECTANGLE
switch(choice)
// case RECTANGLE, LINE, CIRCLE
关于你的问题,你能回答我的问题吗?
【讨论】:
我的逻辑很好,我可能可以使用枚举,但无论如何这不是我的问题。我的问题是我需要清除所有绘制的图形,然后以某种方式再次为此 JPanel 调用paintComponent。 你应该不需要清除所有图形来实现你想要的。 查看 camickr 的回答,如果您没有按照他的概述进行操作,请先关注这一点。以上是关于JPanel 图形清除和重绘?的主要内容,如果未能解决你的问题,请参考以下文章