Рисование анимации на выставке JDialog

Как лучше всего нарисовать простую анимацию непосредственно перед показом модального JDialog? (т. е. расширение границ от точки щелчка мыши до местоположения диалогового окна). Я думал, что можно будет рисовать на стекле родительского фрейма по методу setVisible диалога.

Однако, поскольку JDialog является модальным для родителя, я не смог найти способ перекачивать события рисования в EDT до того, как JDialog станет видимым, поскольку текущее событие в EDT еще не завершено.


person hakan    schedule 02.09.2008    source источник


Ответы (4)


Вы пытаетесь показать JDialog независимо от анимации? Чтобы правильно установить порядок, вам может потребоваться объединить эти действия в исполняемый файл, который сразу передается в EDT.

eg:

SwingUtilities.invokeLater(new Runnable(){
   public void run(){
      doAnnimation();
      showDialog();
   }
}

Лучше всего создать подкласс JDialog, чтобы можно было просто добавить логику doAnnimation() в метод setVisible(..) или show() перед вызовом реализации суперкласса.

Наконец, я предполагаю, что вам нужно будет установить размеры диалогового окна вручную - я не помню, будет ли Java знать фактический размер диалогового окна до его отображения, поэтому вы можете получить бесполезную информацию для вашей анимации, если вы запросите размер, прежде чем показывать его.

person rcreswick    schedule 02.09.2008

Возможно, вы взглянули на проект SwingWorker, включенный в JSE 6. (ссылка на SwingWorker) В книге "Filthy Rich Client", которую я читаю в данный момент, много используется этот инструмент. Возможно, вы сможете найти подсказку в примерах на сайте книг: http://filthyrichclients.org/

person Roland Schneider    schedule 18.09.2008

Возможно, вы сможете взять ответ @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(), но он должен работать.

person John Meagher    schedule 04.09.2008

Одна из возможностей — нарисовать свой собственный диалог на стеклянной панели. Тогда вы получите полный контроль над диалогом и сможете рисовать все, что захотите. Вот учебник по созданию анимации на панели Glass.

person Jay Askren    schedule 07.09.2010