在显示模态JDialog之前绘制简单动画的最佳方法是什么?(即从鼠标单击点扩展边框到对话框位置)。我认为可以setVisible
在对话框的方法上绘制父框架的玻璃窗格。
但是,由于 JDialog 对父级是模态的,因此在 JDialog 变得可见之前,我找不到将绘图事件泵入EDT的方法,因为 EDT 上的当前事件尚未完成。
在显示模态JDialog之前绘制简单动画的最佳方法是什么?(即从鼠标单击点扩展边框到对话框位置)。我认为可以setVisible
在对话框的方法上绘制父框架的玻璃窗格。
但是,由于 JDialog 对父级是模态的,因此在 JDialog 变得可见之前,我找不到将绘图事件泵入EDT的方法,因为 EDT 上的当前事件尚未完成。
您是否试图独立显示动画的 JDialog?为了正确设置订单,您可能需要将这些操作捆绑在一个可运行文件中,该可运行文件立即传递给 EDT。
例如:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
doAnnimation();
showDialog();
}
}
最好将 JDialog 子类化,这样您就可以在调用超类实现之前将 doAnnimation() 逻辑添加到 setVisible(..) 或 show() 方法。
最后,我想你需要手动设置 dalog 的尺寸——我不记得 Java 是否会在显示对话框之前知道对话框的实际大小,所以如果你可能会得到一些无用的动画信息在显示之前查询大小。
也许你看看 JSE 6 中包含的 SwingWorker 项目。(链接到 SwingWorker)在我正在阅读的“肮脏的富客户端”一书中,他们经常使用这个工具。也许您可以在书籍网站上的示例中找到提示:http: //filthyrichclients.org/
一种可能性是在 Glass Pane 上绘制您自己的对话框。然后你就可以完全控制对话框并且可以绘制任何你想要的东西。 这是在 Glass Pane上创建动画的教程。
您也许可以采用@rcreswick 的答案并对其进行一些扩展以使其发挥作用。
void myShowDialog() {
new Thread(new Runnable() {public void run() {
SwingUtilities.invokeAndWait(new Runnable() { public void run() {
doAnimation();
} } );
// Delay to wait for the animation to finish (if needed)
Thread.sleep(500);
SwingUtilities.invokeAndWait(new Runnable() { public void run() {
showDialog();
} } );
} } ).start();
}
它非常难看,必须代替基本的 showDialog() 调用来调用,但它应该可以工作。