J
java2000
Gast
Hallo zusammen ,
Mein Programm soll drei Bilder einlesen, eine zeitintensive Operation auf jedes anwenden und dann im GUI ausgeben. Die Bilder sollen nacheinander durchgerechnet werden, also kein Multithreading, und sobald ein Bild fertig ist, soll dieses sofort im GUI gezeichnet werden. Eine Lösung ist mir gelungen, indem ich SwingUtilities.invokelater() geschachtelt habe, aber diese Methode gefällt mir nicht besoders, vielleicht weiss jemand eine elegantere Methode.
Ich habe ein abstraktes Modell geschrieben und Buttons stellvertretend für Images verwendet.
Leider lassen sich die SwingUtilities-Konstrukte nicht einfach untereinander schreiben, wie ich es zuerst probiert hatte. Dann wird das GUI nämlich erst ganz am Schluss neu gezeichnet, wenn alle Berechnungen durchgeführt worden sind.
Vielen Dank für alle Tipps
Gruss
Martin
Mein Programm soll drei Bilder einlesen, eine zeitintensive Operation auf jedes anwenden und dann im GUI ausgeben. Die Bilder sollen nacheinander durchgerechnet werden, also kein Multithreading, und sobald ein Bild fertig ist, soll dieses sofort im GUI gezeichnet werden. Eine Lösung ist mir gelungen, indem ich SwingUtilities.invokelater() geschachtelt habe, aber diese Methode gefällt mir nicht besoders, vielleicht weiss jemand eine elegantere Methode.
Ich habe ein abstraktes Modell geschrieben und Buttons stellvertretend für Images verwendet.
Code:
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MyDemo extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyDemo frame = new MyDemo();
frame.setVisible(true);
frame.load(); // lade Image/Button
}
} );
}
public MyDemo() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
setSize(300,100);
setLocationByPlatform(true);
}
private void load() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JButton button = new JButton("Eins");
render(button); // Zeitintensive Berechnung
add(button);
validate();
SwingUtilities.invokeLater(new Runnable() { // Hier gibt es eine unschöne Verschachtelung
public void run() {
JButton button = new JButton("Zwei");
render(button); // Zeitintensive Berechnung
add(button);
validate();
}
// ... und weitere SwingUtilities-Konstruke ...
});
}
});
}
private void render(JButton button) {
// Zeitintensive Berechnung verändert das Image/Button
try {
Thread.sleep(1000); // *Berechnung der Redaktion bekannt ;)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Leider lassen sich die SwingUtilities-Konstrukte nicht einfach untereinander schreiben, wie ich es zuerst probiert hatte. Dann wird das GUI nämlich erst ganz am Schluss neu gezeichnet, wenn alle Berechnungen durchgeführt worden sind.
Vielen Dank für alle Tipps
Gruss
Martin