在显示模态JDialog之前绘制简单动画的最佳方法是什么? (即从鼠标点击点扩展边框到对话框位置)。我认为可以在对话框的setVisible
方法上绘制父框架的玻璃板。
但是,由于JDialog是父模式的模态,因此我无法找到在JDialog变为可见之前将绘图事件泵入EDT的方法,因为EDT上的当前事件尚未完成。
答案 0 :(得分:1)
你是否试图独立显示JDialog的动画?为了正确设置订单,您可能需要将这些操作捆绑在一次传递给EDT的runnable中。
例如:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
doAnnimation();
showDialog();
}
}
最好将JDialog子类化,以便在调用超类实现之前,只需将doAnnimation()逻辑添加到setVisible(..)或show()方法即可。
最后,我想你需要手动设置dalog的维度 - 我不记得Java在显示之前是否知道对话框的实际大小,所以你可能会得到一些无用的信息给你如果在显示之前查询大小,则为annimation。
答案 1 :(得分:1)
也许你看一下JSE 6中包含的SwingWorker项目。(Link to SwingWorker)在我正在阅读的“肮脏的富客户端”一书中他们现在使用这个工具了很多。也许您可以在图书网站上的示例中找到提示:http://filthyrichclients.org/
答案 2 :(得分:0)
您可以接受@ 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()调用,但它应该可以工作。
答案 3 :(得分:0)
一种可能性是在Glass Pane上绘制自己的对话框。然后你可以完全控制对话框,并可以绘制你想要的任何东西。在Glass Pane上Here's a tutorial on creating animations。