Ich versuche ein Programm in Java zu erstellen, das hintereinander eine Reihe von Bildern anzeigt, die die Größe des Rahmens für jeden anpassen. ich JPanel erstreckt, ein Bild wie folgt angezeigt:Java warte auf die Komponente, die gemalt werden soll
public class ImagePanel extends JPanel{
String filename;
Image image;
boolean loaded = false;
ImagePanel(){}
ImagePanel(String filename){
loadImage(filename);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(image != null && loaded){
g.drawImage(image, 0, 0, this);
}else{
g.drawString("Image read error", 10, getHeight() - 10);
}
}
public void loadImage(String filename){
loaded = false;
ImageIcon icon = new ImageIcon(filename);
image = icon.getImage();
int w = image.getWidth(this);
int h = image.getHeight(this);
if(w != -1 && w != 0 && h != -1 && h != 0){
setPreferredSize(new Dimension(w, h));
loaded = true;
}else{
setPreferredSize(new Dimension(300, 300));
}
}
}
Dann in Event Thread tun Ich bin Hauptarbeit:
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createGUI();
}
});
In createGUI() Ich bin Gehen Sie durch die Menge der Bilder:
ImagePanel imgPan = new ImagePanel();
add(imgPan);
for(File file : files){
if(file.isFile()){
System.out.println(file.getAbsolutePath());
imgPan.loadImage(file.getAbsolutePath());
pack();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Das Problem ist, dass mein Programm die Größenänderung p Roperly, also Bilder werden korrekt geladen, aber es zeigt nichts an. Wenn ich nur 1 Bild anzeigen, funktioniert es auch für das letzte Bild. Ich denke, das Problem ist, dass Thread.sleep() aufgerufen wird, bevor das Bildmalen beendet ist.
Wie kann ich warten, bis mein ImagePanel fertig ist und danach wartet? Oder gibt es einen anderen Weg, um das Problem zu lösen?
Danke! Leonty
Danke! Das hat mich auf den richtigen Weg gebracht! Ich führe jetzt Code im Hauptthread aus und alle Operationen sind jetzt synchron, so dass das Warten erst nach dem Ende des Malens erfolgt. – Leonti