Als ich versuchte zu sehen, ob ich this question earlier today beantworten konnte. Ich erkannte, dass ich die Event Dispatch Thread
(EDT) nicht vollständig verstehe. Googling beide bestätigten und halfen damit und verdeutlichten why I don't. (This könnte auch für das Verständnis relevant sein.)Wie ermöglicht das Ignorieren des Ereignisversand-Threads, dass dieses Programm funktioniert?
Der Code erstellt eine GUI und später (wie in der früheren Frage) aktualisiert ein Textfeld, bis ein Flag nicht festgelegt ist.
Ich habe mehrere Fragen/Wünsche.
Bitte beschreiben Sie den Code unten in Ordnung läuft, wenn beide Anrufe (zu
swingInit
unddoIt
) außerhalb desinvokeLater
Block sind (wie dargestellt), da beide Anrufe beeinflussen oder die GUI abfragen noch weder auf dem EDT ausgeführt werden (sind sie?). Ist das nicht einladender Misserfolg?-Code läuft auch, wenn Aufruf
swingInit
innen und außendoIt
invokeLater
. AlsoswingInit
wird auf dem EDT ausgeführt, sollte aber nichtdoIt
auf dem EDT nicht ein Problem sein? (Ich war überrascht, dass das funktionierte Sollte ich gewesen sein.?)Ich glaube, ich verstehe, warum es hängt, wenn
doIt
inneninvokeLater
ist unabhängig davon, woswingInit
ist: der ZweckinvokeLater
ist NUR initialisieren die GUI (Recht?).Sollte
doIt
nur (von einem Ereignis eventuell auftretende) initiiert werden auf dem EDT aber sicherlich nicht innerhalbinvokeLater
Block?
(Die Geschichte des EDT-Konzept ist interessant. Es ist nicht immer so war. Link Siehe oben "warum ich nicht" verstehen.)
import static java.awt.EventQueue.invokeLater;
import java.awt.event.*;
import javax.swing.*;
public class Whatever
{
static boolean flag = true;
static JTextField tf = new JTextField("Hi",20);
static JPanel p = new JPanel();
static JFrame f = new JFrame();
static JButton b = new JButton("End");
public static void main(String[] args)
{
swingInit();
invokeLater
(
new Runnable()
{
@Override
public void run()
{
// swingInit();
// doIt();
}
}
);
doIt();
}
static void swingInit()
{
b.addMouseListener
(
new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
flag = false;
JOptionPane.showMessageDialog(null,"Clicked... exiting");
System.exit(0);
}
}
);
p.add(tf);
p.add(b);
f.add(p);
f.setVisible(true);
f.pack();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
static String getInfo(){
return "Hello... " + Math.random();
}
static void doIt(){
while(flag)
tf.setText(getInfo());
};
}
Wie ich denke, Sie verstehen, sollten Sie die GUI nicht von anderen Threads als der EDT aktualisieren - jedoch nicht * unbedingt * scheitern - es ist nur sehr riskant. Seien Sie also nicht überrascht, wenn ein solcher Code manchmal zu funktionieren scheint. – DNA