Могу ли я установить таймер на поле Java Swing JDialog для закрытия через несколько миллисекунд - PullRequest
10 голосов
/ 20 августа 2009

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

Ответы [ 3 ]

14 голосов
/ 20 августа 2009

Это решение основано на 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");
    }
}
7 голосов
/ 20 августа 2009

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

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 голосов
/ 20 августа 2009

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

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

...