Bilder aktualisieren

Ich arbeite seit einiger Zeit an einem Programm, welches unter anderem die neuesten Elemente (jpeg’s) eines Ordners auf verschiedenen Monitoren darstellen soll. Dies funktioniert auch erst einmal. Jetzt möchte ich allerdings, dass die angezeigten Bilder auch aktualisiert werden und genau da hängt es bei mir.
Mit diesem Code zeigt es mir das aktuellste Bild an.

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class vorschau1 extends JPanel implements ActionListener
{
	Timer time;
	static Image foto;
	
	static int breite;
	static int höhe;
	static ImageIcon u;
	static int n;
	static File pfad;

	public vorschau1(int x, int y, File p,int q)
	{
		breite = x;
		höhe = y;
		pfad = p;
		n = q;
		
		setFocusable(true);

		u = new ImageIcon(new newImage().newImage(pfad, n).getPath());
		foto = u.getImage().getScaledInstance(3*höhe/4, höhe, 0);
		
		time = new Timer(50, this);
		time.start();
	}

	public void actionPerformed(ActionEvent e)
	{
		repaint();

	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		Graphics2D f2 = (Graphics2D)g;
		
		f2.drawImage(foto, (breite-foto.getWidth(null))/2, 0, null);
	}

}

(x und y sind die Bildschirmmaße, pfad der Ordner mit den Bildern, q die Anzahl der Bilder auf anderen Monitoren und newImage() gibt mir das neueste Jpeg zurück)

Damit nun eine dauerhafte Aktualisierung eintritt, habe ich u = new ImageIcon(new newImage().newImage(pfad, n).getPath()); foto = u.getImage().getScaledInstance(3*höhe/4, höhe, 0);
vor drawImage() gesetzt. Dies erzeugt aber nur ein weißes Bild.
Wo liegt der Fehler???

Vielen Dank schonmal für eure Mühe.

Du musst paintComponent() überschreiben, nicht paint(). Den Code aus paint() übernimmst du dann komplett in die paintComponent()-Methode.
Erste Zeile sollte dann aber auch immer sein: super.paintComponent(Graphics g);

Hab es jetzt abgeändert. Das Bild wird allerdings immer noch nicht angezeigt.

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class vorschau1 extends JPanel implements ActionListener
{
	Timer time;
	static Image foto;
	
	static int breite;
	static int höhe;
	static ImageIcon u;
	static int n;
	static File pfad;

	public vorschau1(int x, int y, File p,int q)
	{
		breite = x;
		höhe = y;
		pfad = p;
		n = q;
		
		setFocusable(true);

		
		time = new Timer(50, this);
		time.start();
	}

	public void actionPerformed(ActionEvent e)
	{
		repaint();

	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D f2 = (Graphics2D)g;

		u = new ImageIcon(new newImage().newImage(pfad, n).getPath());
		foto = u.getImage().getScaledInstance(3*höhe/4, höhe, 0);	
		
		f2.drawImage(foto, (breite-foto.getWidth(null))/2, 0, null);
	}

}


u = new ImageIcon(new newImage().newImage(pfad, n).getPath());

sowas sollte man in der paintComponent Methode nicht machen. Dein Bild wird immer und immer wieder (jedes mal wenn sich irgendwas in deinem Fenster ändert) neu von der Festplatte geladen. Am besten du lässt deiner Klasse gleich ein BufferedImage übergeben.

http://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen

Auch wenn der Code SO weit weg von Conventions ist, dass er schon arg schwer zu lesen ist, und nicht ganz klar ist, was du meinst: AFAIR hat ImageIcon einen internen Cache für die Bilder, d.h. man bekommt da bestimmte Aktualisierungen nicht mit. Aber wenn man das Bild mit ImageIO als BufferedImage lädt (und zwar NICHT in der paintComponent-Methode) sollte das Problem ohnehin wegfallen.

Okay mit BufferedImage hat es endlich funktioniert. Allerdings muss ich den Timer schon mindestens auf 5000 stellen damit das Neuladen nicht nervig wird. Gibt es vielleicht eine Methode welche einen Ordner auf
Aktualisierung überprüft ?

Seit Java 7 gibt’s eingebaut sowas wie http://docs.oracle.com/javase/tutorial/essential/io/notification.html , falls du das meinst. Für ältere Java-Versionen gibt es Bibliotheken, die sowas machen, aber die eingebauten Methoden wären zu bevorzugen.