Привет, возможно ли создать Java Swing JDialog
(или альтернативный тип объекта Swing), который я могу использовать для оповещения пользователя о определенном событии и затем автоматического закрытия диалога после задержки; без необходимости закрывать диалог?
Могу ли я установить таймер в окне Java Swing JDialog, чтобы закрыть его после нескольких миллисекунд
Ответ 1
Это решение основано на 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");
}
}
Ответ 2
Да, конечно, вы можете. Вы пытались спланировать закрытие?
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 секунд, и вы увидите текст "Диалог закрыт", напечатанный на консоли
Ответ 3
Я бы использовал таймер Swing. Когда запускается таймер, код будет выполняться в потоке Dispatch Event автоматически, и все обновления в GUI должны выполняться в EDT.
Прочтите раздел из руководства Swing по Как использовать таймеры.