2011-08-01 40 views
8

我有一个JPanelpaintComponent()函数。我会调用它一次,然后当用户点击不同的JButton时,我会设置一些标志,并且希望再次调用此函数,因为它会在设置标志后做一些稍微不同的事情。JPanel图形清理和重绘?

所以这里是我想知道的:我如何清除paintComponent现有的东西?并重新绘制,我是否再次拨打paintComponent

目前我正在尝试以下:

flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

在涂料成份,我做的东西,如:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

但经过测试,好像有什么毛病我什么这样做。

感谢您的任何帮助。

+0

你没有从paintComponent方法中调用repaint(),是吗?你确定repaint()调用与你想要刷新的面板有关吗? (例如myPanel.repaint())? –

回答

14

当你改变面板的属性,那么你需要调用:

panel.repaint(); 

造成组件进行重新绘制。

然后在的paintComponent()方法的第一个语句应该是:

super.paintComponent(g); 

这将绘制背景,所以你现在可以做你的风俗画。

如果您需要更多帮助,请发布您的SSCCE来证明问题。

2

首先,为什么不使用枚举而不是布尔值?

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

关于你的问题,你能回答我的问题吗?

+0

我拥有的逻辑很好,我可以使用枚举,但不管那不是我的问题。我的问题是,我需要清除所有绘制的图形,然后再次调用paintComponent为此JPanel。 – JDS

+0

您不需要清除所有图形即可实现您想要的功能。 –

+0

请参阅camickr的回答,如果您没有按照他的概述进行操作,请首先关注。 –

2

我建议调用revalidate();而不是repaint()。当更改大小/布局时,或者当您向jpanel添加/删除对象并更新其所有子项时,需要调用revalidate()。从我所知道的情况来看,你仍然在使用相同的绘画对象,但改变它的布局。