在JDialog的展示中绘制动画

时间:2008-09-02 09:41:44

标签: java user-interface swing animation

在显示模态JDialog之前绘制简单动画的最佳方法是什么? (即从鼠标点击点扩展边框到对话框位置)。我认为可以在对话框的setVisible方法上绘制父框架的玻璃板。

但是,由于JDialog是父模式的模态,因此我无法找到在JDialog变为可见之前将绘图事件泵入EDT的方法,因为EDT上的当前事件尚未完成。

4 个答案:

答案 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