在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/

回答

一种可能性是在玻璃窗格上绘制自己的对话框。然后,我们可以完全控制对话框,并可以绘制所需的任何内容。这是有关在玻璃窗格上创建动画的教程。