Ich muss ehrlich sagen, dass ich bis vor Kurzem die Problematik mit dem Event Dispatcher Thread nicht wirklich verstanden habe... jetzt lese ich gerade filthy rich clients und jetzt wird die Sache klarer...
also:
1. Immer wenn ich Swing Komponenten bearbeite, erzeuge usw.. sollte das im EDT geschehen
2. Immer wenn ich Dinge mache die nicht Swing betreffen (Fachlogik) sollte das nicht im EDT geschehen
also sowas ist vollkommen falsch
aber nicht nur, weil die Berechnung im Edt ausgeführt wird... sondern auch weil das Erzeugen der Gui Kommponenten nicht im EDT ausgeführt wird oder?
so würde es richtig sein, oder?
aber sorry, ist dann swing nicht irgendwie eine fehlkonstruktion?
Immer wenn ein event erzeug wird und ich in den meisten fällen fachlogik ausführe muss ich einen thread erzeugen? Warum kann das swing nicht für mich machen?
Immer wenn ich Gui Komponenten erzeuge muss ich das explizit mit SwingUtilities.invokeLater machen? Auch nicht sehr intuitiv...
Was sagt ihr dazu?
also:
1. Immer wenn ich Swing Komponenten bearbeite, erzeuge usw.. sollte das im EDT geschehen
2. Immer wenn ich Dinge mache die nicht Swing betreffen (Fachlogik) sollte das nicht im EDT geschehen
also sowas ist vollkommen falsch
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Test extends JFrame implements ActionListener
{
public static void main(String[] args){
Test f = new Test();
JButton button = new JButton("test");
button.addActionListener(f);
f.add(button);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
public void actionPerformed(ActionEvent e){
System.out.println("Button wurde geklickt");
System.out.println("berechnungs usw...");
try{
Thread.sleep(2000);
}catch (InterruptedException e1){}
System.out.println("fertig");
}
}
aber nicht nur, weil die Berechnung im Edt ausgeführt wird... sondern auch weil das Erzeugen der Gui Kommponenten nicht im EDT ausgeführt wird oder?
so würde es richtig sein, oder?
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Test extends JFrame implements ActionListener{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
Test f = new Test();
JButton button = new JButton("test");
button.addActionListener(f);
f.add(button);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
});
}
public void actionPerformed(ActionEvent e){
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("Button wurde geklickt");
System.out.println("berechnungs usw...");
try{
Thread.sleep(2000);
}catch (InterruptedException e1){}
System.out.println("fertig");
}
}).start();
}
}
Immer wenn ein event erzeug wird und ich in den meisten fällen fachlogik ausführe muss ich einen thread erzeugen? Warum kann das swing nicht für mich machen?
Immer wenn ich Gui Komponenten erzeuge muss ich das explizit mit SwingUtilities.invokeLater machen? Auch nicht sehr intuitiv...
Was sagt ihr dazu?