Here we can see How to write a responsive User interfaces using Swing.
Most post-initialization GUI work naturally occurs in the event-dispatching thread. Once the GUI is visible, most programs are driven by events such as button actions or mouse clicks, which are always handled in the event-dispatching thread. A program that uses separate worker threads to perform GUI-related processing can use invokelater and invokeandwait methods to cause a Runnable object to be run on the event-dispatching thread.
These methods were originally provided in the SwingUtilities
class.
- invokeLater requests that some code be executed in the event-dispatching thread. This method returns immediately, without waiting for the code to execute.
- invokeandwait acts like invokeLater , except that it waits for the code to execute. Generally, you should use invokeLater instead.
You can call invokeLater from any thread to request the event-dispatching thread to run certain code. You must put this code in the
run
method of a Runnable object and specify the Runnable object as the argument to invokeLater .
The invokeLater method returns immediately, it doesn't wait for the event- dispatching thread to execute the code. Runnable doWork = new Runnable() {
public void run() {
// GUI Work here
}
};
SwingUtilities.invokeLater(doWork);
The invokeandwait method is just like the invokeLater method, except that invokeandwait doesn't return until the event-dispatching thread has executed the specified code. Whenever possible, you should use invokeLater instead of invokeandwait .
If you use invokeandwait ,
make sure that the thread that calls invokeandwait does not hold any locks that other threads might need while the invoked code is running.
below shows how a thread that needs access to GUI state, such as the contents of a pair of JTextFields,
can use invokeandwait to access the necessary information.
void showHelloThereDialog() throws Exception {
Runnable doShowModalDialog = new Runnable() {
public void run() {
JOptionPane.showMessageDialog(myMainFrame,
"HelloThere");
}
};
SwingUtilities.invokeAndWait(doShowModalDialog);
}
void printTextField() throws Exception {
final String[] myStrings = new String[2];
Runnable doGetTextFieldText = new Runnable() {
public void run() {
myStrings[0] = textField0.getText();
myStrings[1] = textField1.getText();
}
};
SwingUtilities.invokeAndWait(doGetTextFieldText);
System.out.println(myStrings[0] + " " + myStrings[1]);
}
Using invokeAndWaitto access GUI state
0 Comments:
Post a Comment