Bild Zeitverzögert anzeigen

Status
Nicht offen für weitere Antworten.

ProgrammierGenie

Aktives Mitglied
hallo,
Ich will, dass ein Bild in einem Applet erst nach 5 sec angezeigt wird. Ich habs ungefähr so gemacht wie es in "Java ist auch eine Insel" steht.

Das ist mein Code:
Code:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ObjectViewer extends Applet
{
	private BufferedImage ato;

	public void init(){
		Zeichne z = new Zeichne();		
		long long1 = System.currentTimeMillis();
		this.ato = new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);
		try{
			this.ato = ImageIO.read(new File("hallo.jpg")); 
		} catch(IOException e){}
		
		while((System.currentTimeMillis() - long1) < 5000){}
		this.ato.setRGB(35, 24, Color.red.getRGB());
		z.draw(this.ato);
	}
	
	private class Zeichne{
		private BufferedImage auto;
				
		public void draw(BufferedImage ato){
			this.auto = ato;
			repaint();
		}
		
		public void paint(Graphics g)
		{
			g.drawImage(this.auto, 0, 0, (ImageObserver)this);
		}
	}
}

Wenn ich es ausführe wird das Applet geöffnet(kein Inhalt) und es steht Applet geladen. Nach 5 sec steht Applet gestartet, es wird aber weiter nichts angezeigt.

Was mache ich falsch?
 
Warten tut man mit Thread.sleep(long millis). Wenn du möchtest, dass dein Programm dabei weiterläuft musst du das ganze in einen extra Thread auslagern. Dabei wäre zu beachten, dass Swing nicht Thread-Sicher ist. SwingUtilities#invokeLater hilft dir hierbei.

Ich arbeite normal nicht mit inneren Klassen, von daher kann ich dir nicht 100pro genau sagen ob das so geht wie du das schreibst, aber imho wird deine paint-Methode nie aufgerufen, weil sie sich in einer inneren Klasse befindet. Sicher dass du das Applet auch ohne Fehler compilen kannst? Weiß jetzt nämlich nicht, ob du einfach so von einer inneren Klasse eine Methode deiner äußeren Klasse aufrufen kannst. Warum arbeitest du hier überhaupt mit inneren Klassen???
 
Ich will, dass ein bild geladen wird und nach einer zeit soll ein anderes bild geladen werden. Aber die Paint Methode wird erst ganz am Schluss aufgerufen oder? wenn ich nämlich alles in einer Klasse mache, die Funktion draw() aufrufe, dann warte und draw() mit einem anderen BufferedImage aufrufe, wird die Zeit abgewartet bis alles ausgeführt wurde, und dann wird erst gezeichnet.
 
Ich glaub es ist das Beste wenn ich dir mal nen kleinen Beispiel-Code zeig!? Du willst also dass alle 5 Sekunden ein neues Bild angezeigt wird!?
 
Code:
import javax.swing.*;
import java.awt.*;
import java.net.*;

public class BildApplet extends JApplet {
	
	private ImageIcon img = null;
	private String[] pics = {"Blaue Berge.jpg", "Sonnenuntergang.jpg", "Winter.jpg", "Wasserlilien.jpg"};
	
	public void init() {
		
		try {
			img = new ImageIcon(new URL(getCodeBase(), pics[0]));
		}
		catch (MalformedURLException e) {
			e.printStackTrace();
		}
		loadPics();
	}
	
	public void loadPics() {
		
		new Thread(new Runnable() {
			public void run() {
				while (true) {
					for (int i = 0; i < pics.length; i++) {
						try { 
							img = new ImageIcon(new URL(getCodeBase(), pics[i])); 
							Thread.sleep(5000);
						} 
						catch(MalformedURLException e) {
							e.printStackTrace(); 
						} 
						catch (InterruptedException e) {
							e.printStackTrace();
						}
						repaint();
					}
				}
			}
		}).start();
	}
	
	public void paint(Graphics g) {
		
		g.drawImage(img.getImage(), 0, 0, this);
	}
}

Musst halt im Array "pics" den Pfad für jedes Bild dementsprechend anpassen.
 
Wildcard hat gesagt.:
Ich denke ein Timer währe hier sinnvoller.

Timer ... pff ... Threads for President :lol: .

Threads sind mir so spontan in Kopf geschossen, habs dann halt schnell deswegen auch mit Threads gemacht. Gut, Swing ist nicht Thread-Sicher, aber so das Problem bei einem kleinen Beispiel-Programm sollte das nicht darstellen 😉 . Oder hat Timer sonst noch Vorzüge (arbeite damit sowieso eher selten)?

@ ProgrammierGenie

davon gehe ich aus 😉
 
Naja, ein javax.swing.Timer ist eben genau für sowas gemacht... Große Vorteile hat man damit nicht, aber es ist straight-forward
Der Timer eignet sich übrigens nur für Dinge im Sekundenbereich (also zB nicht 10ms) da er für sehr kleine Intervalle nicht präzise genug ist
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben