在JDialog的展示中绘制动画
时间:2020-03-05 18:46:20 来源:igfitidea点击:
在显示模态JDialog之前,绘制简单动画的最佳方法是什么? (即,将边框从鼠标单击点扩展到对话框位置)。我认为可以在对话框的" setVisible"方法上绘制父框架的玻璃窗格。
但是,由于JDialog对父对象是模态的,因此我无法找到在JDialog可见之前将绘图事件泵入EDT的方法,因为EDT上的当前事件尚未完成。
解决方案
回答
我们是否要独立显示动画的JDialog?为了正确设置顺序,我们可能需要将这些操作捆绑在一个可运行的设备中,然后立即将其传递给EDT。
例如:
SwingUtilities.invokeLater(new Runnable(){ public void run(){ doAnnimation(); showDialog(); } }
最好对JDialog进行子类化,以便我们可以在调用超类实现之前将doAnnimation()逻辑添加到setVisible(..)或者show()方法中。
最后,我想我们需要手动设置dalog的尺寸-我不记得Java在显示对话框之前是否会知道对话框的实际大小,因此如果我们查询,我们可能会得到一些无用的信息来显示动画显示之前的大小。
回答
我们也许可以采用@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()调用,但它应该可以工作。
回答
也许我们可以看看JSE 6中包含的SwingWorker项目。(链接到SwingWorker)在我现在正在阅读的" Filthy Rich Client"一书中,他们经常使用此工具。也许我们可以在图书网站上的示例中找到提示:http://filthyrichclients.org/
回答
一种可能性是在玻璃窗格上绘制自己的对话框。然后,我们可以完全控制对话框,并可以绘制所需的任何内容。这是有关在玻璃窗格上创建动画的教程。