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?
views:
800answers:
3
+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
2009-08-20 15:18:51
You should call dialog.setVisisble(false) on the event dispatch thread. Otherwise the code behaviour is unpredictable.
Steve McLeod
2009-08-20 15:55:12
This is very true - I omitted this for reasons of confusion
oxbow_lakes
2009-08-20 16:26:40
+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
2009-08-20 15:27:08
+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
2009-08-20 16:01:31