【发布时间】:2013-09-13 15:55:34
【问题描述】:
我正在玩一些 Java 图形类,我只是想知道——什么时候需要调用 repaint() 方法?我尝试将其注释掉,但它似乎并没有影响我的输出 GUI。不过,我已经看到它在我读过的 Java GUI 代码中使用了很多。有人介意解释一下什么时候使用它,什么时候不使用它?
【问题讨论】:
我正在玩一些 Java 图形类,我只是想知道——什么时候需要调用 repaint() 方法?我尝试将其注释掉,但它似乎并没有影响我的输出 GUI。不过,我已经看到它在我读过的 Java GUI 代码中使用了很多。有人介意解释一下什么时候使用它,什么时候不使用它?
【问题讨论】:
repaint() 刷新视图(组件),因此每当您对组件进行任何更改时,都必须调用它。例如,如果您旋转图形组件,则必须调用 repaint() 才能看到包含组件的更改
【讨论】:
getX() 和getY() 给出。然后创建一个图形 g 这将是我要显示的区域和repain(g)。
在大多数 Swing 应用程序中从来没有真正必要,因为它们会自动处理它(用于常见操作,例如更改按钮上的文本值和向列表框添加数据)。
通常,只有在您进行了某种更改时,swing 才会自动拾取 - 例如,您没有使用布局管理器并且正在手动调整组件的大小(因为通常布局管理器会重新绘制其组件必要时)。
【讨论】:
当您启动应用程序时,您“绘制”了您的 GUI。
当你想重新绘制你的 GUI 时,你需要调用 repaint(),因为你已经改变了里面的东西。
如果你想删除一个按钮,你需要移除它(或者让它不可见)然后你需要调用validate()或者repaint()来重新计算(重新绘制)GUI。
【讨论】:
我唯一能想到的东西:
new Thread() {
@Override
public void run() {
while (ClassName.this.isVisible()) {
ClassName.this.updateStatusLabel();
ClassName.this.validate();
ClassName.this.repaint(50L);
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
Log.log(e);
}
}
}
}.start();
假设您在 JDialog 的构造函数中有上述代码。 updateStatusLabel 所做的是检查一个布尔变量,无论是公共的还是可通过方法设置的,并将基础中的 JLabel 的图标设置为此类布尔变量。如果您不验证并重新绘制 GUI,则在引发另一个事件(很可能是用户触发的事件)之前,不会显示修改。而且,如果用户正在等待标签显示某个图标,比方说,它表明设备是否可以通过 Internet 访问,他/她将永远不会进行交互(或者,至少,您正在延迟交互这么多)。
【讨论】: