Рисование анимации на показе JDialog

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
1 570
4

Ответы 4

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

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

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

Другие вопросы по теме