我正在整理一个Swing应用程序,我常常想要替换JPanel的内容.要做到这一点,我正在打电话removeAll(),然后添加我的新内容,然后打电话revalidate().
但是我发现旧内容仍然可见(虽然被新内容遮挡了).如果我添加调用repaint()除revalidate(),它按预期工作.
我确信在其他场合我经历过只是打电话revalidate()就足够了.
所以基本上我的问题是 - 我是否需要调用这两个函数,如果没有,我什么时候应该调用它们?
请解释SwingUtilities中的invokeAndWait()方法.我无法理解这一点. 非常清楚地解释一下. 如果你尝试一个例子,那将是很有帮助的.
编辑添加@ noob扩展问题:
什么是不太清楚这个?
这是一个修改过的用法示例:
import javax.swing.SwingUtilities;
public class InvokeAndWaitStuff
{
public static void main(String[] args)
{
final Runnable doHelloWorld = new Runnable() {
public void run() {
System.out.println("Hello World on " + Thread.currentThread());
}
};
Thread appThread = new Thread() {
public void run() {
try {
SwingUtilities.invokeAndWait(doHelloWorld);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("Finished on " + Thread.currentThread());
}
};
appThread.start();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello World on Thread[AWT-EventQueue-0,6,main]
Finished on Thread[Thread-0,5,main]
Run Code Online (Sandbox Code Playgroud)
为什么这很重要?:
导致doHelloWorld.run()在AWT事件派发线程上同步执行.此调用将阻塞,直到处理完所有待处理的AWT事件,并且(然后)doHelloWorld.run()返回.当应用程序线程需要更新GUI时,应使用此方法. …
在处理swing组件时,以及在运行时更改组件时,一个(通常)需要在组件上调用revalidate()方法以便刷新它们.
确定是否需要重新验证组件的规则是什么?当某个组件上的某些特性发生变化时,swing会自动调用revalidate()吗?