I have a simple JFrame dialog, that should display "Please Wait" message while the main program completes other activities (which may take anywhere from 30 seconds to more than 10 minutes):
public JFrame waitDialog() {
JFrame wait = new JFrame();
wait.setTitle("My Dialog");
wait.setAlwaysOnTop(true);
wait.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
wait.setSize(300, 150);
wait.setLocationRelativeTo(null);
wait.setLayout(new BorderLayout());
String msg = "Plase Wait...";
wait.add(new JLabel(msg), BorderLayout.CENTER);
return wait;
}
When I call it within the program flow, it works fine:
...
JFrame wait = waitDialog();
wait.setVisisble(true);
for (int i=0;i<1000;i++){
// Other activities
System.out.println(i);
}
wait.setVisisble(false);
...
However, if I use execute this dialog via an ActionEvent (I click a "Do Other Activities" button on the main application JFrame), even though I use the EXACT SAME CODE to call waitDialog(), the dialog displays without any text. It displays an empty dialog without the "Please Wait..." message:
public void actionPerformed(ActionEvent action){
if (action.getSource==waitforit) {
runWait();
}
Public void runWait() {
JFrame wait = waitDialog();
wait.setVisisble(true);
for (int i=0;i<1000;i++){
// Other activities
System.out.println(i);
}
wait.setVisisble(false);
}
I have reworked this extensively, and cannot understand why the JPanel text fails to display ONLY when I am calling the dialog through an ActionEvent.
What am I missing here?
You can't do it like that anyway. You have an incomplete picture of how Swing threading works. Have a look at the excellently documented SwingWorker
and it will give you some ideas about how to accomplish what you want