9

我有JPanel一个paintComponent()功能。我会调用一次,然后当用户单击不同的 时JButton,我会设置一些标志并想再次调用此函数,因为在设置标志后它会做一些稍微不同的事情。

所以这就是我想知道的:我如何清除现有的东西paintComponent?重绘,我只是paintComponent再打电话吗?

目前我正在尝试以下方法:

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

在油漆组件中,我执行以下操作:

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

但是通过测试,似乎我正在做的事情有问题。

谢谢你的帮助。

4

4 回答 4

15

当您更改面板的属性时,您需要调用:

panel.repaint();

导致组件被重新绘制。

那么paintComponent()方法中的第一条语句应该是:

super.paintComponent(g);

这将绘制背景,因此您现在可以进行自定义绘制。

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

于 2011-08-01T19:01:33.860 回答
14

要清除所有先前绘制的图形,请调用g.clearRect(0, 0, getWidth(), getHeight()).

于 2011-08-01T18:58:46.323 回答
2

我建议调用 revalidate(); 而不是重绘()。revalidate() 需要在更改大小/布局或在 jpanel 上添加/删除对象时调用,并将更新它的所有子项。据我所知,您仍在使用相同的绘画对象,但更改了它的布局。

于 2011-08-01T20:40:52.510 回答
2

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

enum Enum { 
    RECTANGLE,
    LINE,
    CIRCLE
}

Enum choice = RECTANGLE; //default to RECTANGLE

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

关于你的问题,你能回答我在你的问题中的评论吗?

于 2011-08-01T18:46:02.270 回答