Re: New Swing Window Not Drawn
Tom Hawtin wrote:
Hal Vaughan wrote:
public void activate() {
? ? ? ? //flagActive is set to false when the window should disappear
? ? ? ? flagActive = true;
? ? ? ? new Thread(new Runnable() {
? ? ? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("-----Opening Wait Window.");
? ? ? ? ? ? ? ? ? ? ? ? //jSelf is the JFrame class for the window
? ? ? ? ? ? ? ? ? ? ? ? jSelf.setVisible(true);
? ? ? ? ? ? ? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? try {Thread.sleep(50);} catch (Exception
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("Insomnia");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (!flagActive) break;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("-----Closing Wait Window.");
? ? ? ? ? ? ? ? ? ? ? ? jSelf.setVisible(false);
? ? ? ? ? ? ? ? }
? ? ? ? }).start();
? ? ? ? return;
}
Write out a million time "I shall not use Swing components on the Event
Dispatch Thread (EDT)."
It should be simple enough to update the visible state using a bit of
EventQueue.invokeLater:
? ? ?private volatile active;
? ? ?public void setActive(boolean active) {
? ? ? ? ?//flagActive is set to false when the window should disappear
? ? ? ? ?this.active = active;
Do you mean "java.awt.EventQueue.invokeLater()" on the next line?
? ? ? ? ?java.awt.Event.invokeLater(new Runnable() { public void run() {
? ? ? ? ? ? ? ? ? ? ? ? ?//jSelf is the JFrame class for the window
? ? ? ? ? ? ? ? ? ? ? ? ?jSelf.setVisible(MyOuterClass.this.active);
? ? ? ? ?}});
? ? ?}
This leads to something I've had trouble with before. ?If I use
invokeLater() (in this case I'm using it in SwingUtilities), then the GUI
update happens AFTER the work I'm doing.
What do I do if I need to update the GUI before performing other actions?
For example, if I want to warn the user the next operation could take a few
minutes?
I've tried working with this before, and could never get invokeLater() or
invokeAndWait() (which is apparently not as good a method to use) to update
the Swing components before other non-GUI related work is done.
I'd like to be able to do something like this:
? ? ? ? User presses button
? ? ? ? Display is updated with "Working, please wait..." type of message
? ? ? ? Run functions that could take from 1 second to a minute or more
? ? ? ? Update display to get rid of "Please wait..."
No matter what I try, though, the 2nd step does not seem possible and I
cannot find a way to update the GUI before the 3 step (the actual work) is
done.
How do I work with this?
Hal