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 图形清除和重绘?的主要内容,如果未能解决你的问题,请参考以下文章

JFrame / JPanel不会更新重绘或重新验证

如何使用 swift 清除和重绘 UIView 的内容(存在于视图控制器中)?

回流和重绘有啥区别?

怎样理解重流和重绘

JS的回流和重绘

回流和重绘