Могу ли я установить таймер в окне Java Swing JDialog, чтобы закрыть его после нескольких миллисекунд

Привет, возможно ли создать Java Swing JDialog (или альтернативный тип объекта Swing), который я могу использовать для оповещения пользователя о определенном событии и затем автоматического закрытия диалога после задержки; без необходимости закрывать диалог?

3 ответа

Это решение основано на oxbow_lakes ', но оно использует javax.swing.Timer, который предназначен для этого типа вещей. Он всегда выполняет свой код в потоке отправки событий. Это важно, чтобы избежать тонких, но неприятных ошибок

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test {
 public static void main(String[] args) {
 JFrame f = new JFrame();
 final JDialog dialog = new JDialog(f, "Test", true);
 Timer timer = new Timer(2000, new ActionListener() {
 public void actionPerformed(ActionEvent e) {
 dialog.setVisible(false);
 dialog.dispose();
 }
 });
 timer.setRepeats(false);
 timer.start();
 dialog.setVisible(true); // if modal, application will pause here
 System.out.println("Dialog closed");
 }
}


Да, конечно, вы можете. Вы пытались спланировать закрытие?

JFrame f = new JFrame();
final JDialog dialog = new JDialog(f, "Test", true);
//Must schedule the close before the dialog becomes visible
ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor(); 
s.schedule(new Runnable() {
 public void run() {
 dialog.setVisible(false); //should be invoked on the EDT
 dialog.dispose();
 }
}, 20, TimeUnit.SECONDS);
 dialog.setVisible(true); // if modal, application will pause here
 System.out.println("Dialog closed");

Вышеуказанная программа закроет диалог через 20 секунд, и вы увидите текст "Диалог закрыт", напечатанный на консоли


Я бы использовал таймер Swing. Когда запускается таймер, код будет выполняться в потоке Dispatch Event автоматически, и все обновления в GUI должны выполняться в EDT.

Прочтите раздел из руководства Swing по Как использовать таймеры.

licensed under cc by-sa 3.0 with attribution.