Hallo zusammen,
ich habe mal wieder Probleme mit Swing...
Ich habe eben gelesen, dass alles was mit GUI zu tun hat (etwas grob, wenn ihrs genauer wisst wären Erklärungen hilfreich) im Event Dispatcher Thread ausgeführt werden sollte, entweder durch invokeAndWait oder invokeLater.
Jetzt wollte ich eine GUI so in der Art erzeugen:
Das Problem ist, dass ich danach die form und v noch brauche.
Ich hatte mir jetzt überlegt, bei Main statische variablen dafür einzuführen und die zu benutzen, was zwar prinzipiell funktioniert, ich aber sehr unschön finde...
Was gibt es für da für gute Alternativen?
Das Problem ist ja, dass ich von InvokeLater keine Rückgabe bekomme.
Außerdem ist im Code noch eine Frage (als Kommentar) zur ContentPane.
Und dann zu guter letzt noch:
Wie sieht es aus mit invokeAndWait oder invokeLater?
Wo prinzipiell der Unterschied ist weiß ich (bei Wait wird solange noch blockiert, bis es fertig ist).
Ich habe aber gelesen, dass man fast immer invokeLater benutzen sollte.
Jetzt ist das bei mir so, dass dieser PlotPanel folgendes Attribut hat, in das ich reinmalen will und beim paintComponent wird dann das BufferedImage auf den Panel gezeichnet:
private BufferedImage offScreenImage;
Wenn ich invokeLater benutze kann es ja passieren, dass das teil noch gar nicht existiert, wenn ich dann nachher dareinzeichnen will...
Wenn ich außerhalb vom EDT auf diese offScreenImage male, sollte das doch unproblematisch sein, oder?
Dann kann es zwar sein, dass paintComponent aufgerufen wird, während das offScreenImage manipuliert wird, das sollte aber eigentlich nicht so schlimm sein, weil eh dauernd neugezeichnet wird, so dass das nicht sonderlich auffallen sollte, wenn "halb veränderte" bilder gemalt werden.
Oder kann es vll sein, dass das irgendwelche anderen Probleme verursachen kann?
Muss ich dieses
private BufferedImage offScreenImage;
dann eigentlich als volatile definieren, da ja dann sowohl der EDT als auch ein anderer Thread darauf zugreifen soll?
Vielen Dank schonmal für eure Hilfe!
ich habe mal wieder Probleme mit Swing...
Ich habe eben gelesen, dass alles was mit GUI zu tun hat (etwas grob, wenn ihrs genauer wisst wären Erklärungen hilfreich) im Event Dispatcher Thread ausgeführt werden sollte, entweder durch invokeAndWait oder invokeLater.
Jetzt wollte ich eine GUI so in der Art erzeugen:
Java:
private static void createAndShowGUI()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JFrame form = new JFrame("blablub");
form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
View v = new PlotPanel();
form.add(v);
//ist das so richtig, oder sollte ich besser auf die Contenpane
//adden und nicht auf das teil direkt?
form.setVisible(true);
}
});
}
Das Problem ist, dass ich danach die form und v noch brauche.
Ich hatte mir jetzt überlegt, bei Main statische variablen dafür einzuführen und die zu benutzen, was zwar prinzipiell funktioniert, ich aber sehr unschön finde...
Was gibt es für da für gute Alternativen?
Das Problem ist ja, dass ich von InvokeLater keine Rückgabe bekomme.
Außerdem ist im Code noch eine Frage (als Kommentar) zur ContentPane.
Und dann zu guter letzt noch:
Wie sieht es aus mit invokeAndWait oder invokeLater?
Wo prinzipiell der Unterschied ist weiß ich (bei Wait wird solange noch blockiert, bis es fertig ist).
Ich habe aber gelesen, dass man fast immer invokeLater benutzen sollte.
Jetzt ist das bei mir so, dass dieser PlotPanel folgendes Attribut hat, in das ich reinmalen will und beim paintComponent wird dann das BufferedImage auf den Panel gezeichnet:
private BufferedImage offScreenImage;
Wenn ich invokeLater benutze kann es ja passieren, dass das teil noch gar nicht existiert, wenn ich dann nachher dareinzeichnen will...
Wenn ich außerhalb vom EDT auf diese offScreenImage male, sollte das doch unproblematisch sein, oder?
Dann kann es zwar sein, dass paintComponent aufgerufen wird, während das offScreenImage manipuliert wird, das sollte aber eigentlich nicht so schlimm sein, weil eh dauernd neugezeichnet wird, so dass das nicht sonderlich auffallen sollte, wenn "halb veränderte" bilder gemalt werden.
Oder kann es vll sein, dass das irgendwelche anderen Probleme verursachen kann?
Muss ich dieses
private BufferedImage offScreenImage;
dann eigentlich als volatile definieren, da ja dann sowohl der EDT als auch ein anderer Thread darauf zugreifen soll?
Vielen Dank schonmal für eure Hilfe!