Bearbeiten: Ich habe diese link verwiesen und ich bin in der Lage, den Code-Flow von InvokeLater zu verstehen. Meine Frage ist, warum wird diese Logik auf diese Weise umgesetzt? Gibt es bestimmte Gründe?Warum sollte die Methode SwingUtils.invokeAndWait() außerhalb eines EDT-Threads aufgerufen werden?
Folgende ist mein Code:
private void init()
{
JFrame jfr = new JFrame();
jfr.setSize(500, 500);
jfr.setVisible(true);
jfr.setTitle("Test");
JButton jb = new JButton("Ok");
jfr.add(jb);
jb.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
@Override
public void run()
{
System.out.println("hello");
}
});
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
});
erste Frage (Während InvokeAndWait
verwenden):
Warum es so umgesetzt wird, dass sie eine InvocationTargetException
wirft, wenn sie innerhalb EDT genannt Faden?
Zweite Frage (bei der Verwendung von InvokeLater
):
Warum invokeLater dies erlaubt?
Nun, das ist mein Grundverständnis über EDT-Themen:
invokeAndWait:
- Orte Job F in die EDT Ereignis-Warteschlange und wartet, bis die EDT sie ausgeführt hat .
- Dieser Aufruf blockiert, bis alle ausstehenden AWT-Ereignisse (A, B, C, D, E) verarbeitet wurden und (dann) F ausführen, nach denen die Steuerung zurückkehrt.
- Gibt zurück, wenn und nur wenn der Job abgeschlossen ist. (Control kehrt zurück, nachdem F abgeschlossen ist.)
- Technisch ein synchroner blockierender Aufruf.
invokeLater:
- Orte der Job F in die EDT Queue, aber wartet nicht auf seinen Abschluss (Im Grunde genommen ein Anruf veröffentlichen und zurück)..
- Wenn uns die Jobvervollständigung nicht interessiert, können wir InvokeLater verwenden.
- Technisch ein asynchroner nicht blockierender Aufruf.
Mögliches Duplikat der [invokeAndWait Methode in SwingUtilities] (http://stackoverflow.com/questions/5499921/invokeandwait-method-in-swutilities) – Sanjeev