Лично, я избежал бы этого вида кодирования, поскольку я не испытываю желание видеть операторы возврата прежде наконец операторы.
Мой ум прост, и он обрабатывает вещи скорее линейно. Поэтому то, когда я иду через код для сухого выполнения, у меня будет тенденция думать, что, после того как я могу достигнуть оператора возврата, все следует, не имеет значения, который, очевидно, является довольно неправильным в этом случае (не, что это влияло бы на оператор возврата, но чем побочные эффекты могли быть).
Таким образом, я расположил бы код так, чтобы оператор возврата всегда появился после наконец операторы.
Это решение основано на 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 секунд, и вы увидите текст «Диалог закрыт» , напечатанный на консоли
Я бы использовал таймер качания. Когда срабатывает таймер, код будет выполняться в потоке диспетчеризации событий автоматически, и все обновления графического интерфейса должны выполняться в EDT.
Прочтите раздел из учебника Swing на Как использовать таймеры .