views:

800

answers:

3

Hi is it possible to create a Java Swing JDialog box (or an alternative Swing object type), that I can use to alert the user of a certain event and then automatically close the dialog after a delay; without the user having to close the dialog?

+6  A: 

Yes - of course you can. Have you tried to schedule a close?

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");

The above program will close the dialog after 20 seconds and you'll see the text "Dialog closed" printed to the console

oxbow_lakes
You should call dialog.setVisisble(false) on the event dispatch thread. Otherwise the code behaviour is unpredictable.
Steve McLeod
This is very true - I omitted this for reasons of confusion
oxbow_lakes
+2  A: 

I would use a Swing Timer. When the Timer fires the code will be executed in the Event Dispatch Thread automatically and all updates to the GUI should be done in the EDT.

Read the section from the Swing tutorial on How to Use Timers.

camickr
+6  A: 

This solution is based on oxbow_lakes', but it uses a javax.swing.Timer, which is intended for this type of thing. It always executes its code on the event dispatch thread. This is important to avoid subtle but nasty bugs

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");
    }
}
Steve McLeod