Bild in Fenster neu laden ?

thomas01

Grünschnabel
Ich habe ein Fenster mit 2 Buttons und einem Bild. Wie kann ich in während der Laufzeit das Bild durch ein anderes Bild ersetzen ?
Bei meinem Code setzt er das Bild einfach neben das alte Bild.

Code:
import javax.swing.*;
import java.awt.*;

public class test extends JFrame{
	
    static JButton btOK = new JButton("OK");
    static JButton btExit = new JButton("Ende");
    JPanel plButtons = new JPanel();
    
    
    test() {
    	super("ein Test");
        plButtons.setLayout(new GridLayout(0,2));
        plButtons.add(btOK);
        plButtons.add(btExit);
        getContentPane().setLayout( new BorderLayout() );
        getContentPane().add("South", plButtons );
        setSize(10,20);
        JLabel label = new JLabel(new ImageIcon("bild2.jpg"));
        getContentPane().add("North", label);
    }

	public static void main(String[] args) throws Exception {
		test wnd = new test();
		wnd.setLocation(100, 100);
		wnd.setSize(300, 200);
		wnd.setVisible(true);
		Thread.sleep(1000);
		wnd.Ausgabe();
	}

	public void Ausgabe (){
        JLabel label = new JLabel(new ImageIcon("bild1.jpg"));
        getContentPane().add("North", label);
        pack();
	}
}
 
Du musst das JLabel vor dem Setzen der neuen Grafik vom JPanel lösen.
Das heißt bevor du das 2. Bild einfügst musst du mit .remove(JLabel) das JLabel mit dem ersten Bild löschen.
Ich hoffe du hast das verstanden und ich verwirr dich nicht ^^
 
Danke für die Antwort. Hört sich ganz gut an.

Ich hab zwar noch keine Ahnung wie ich das implementiere, aber wenn ich es geschafft habe, werde ich mich wieder melden.
 
Ok ich erklärs dir genauer:
1) Müssen beide JLabel verschiedene Namen haben.
2) Deklarierst du sie am besten unter den JButtons, vor den Konstruktoren/Methoden/Wasauchimmer.
3)So sieht dann Ausgabe() aus:
Code:
...
public void Ausgabe(){
      getContentPane().remove(label1);
      getContentPane().add("North", label2);
      pack();
}

So in etwa hab ich das gemeint, weiß aber nicht ob es funktioniert...
 
Erstmal solltest du in Java Klassennamen groß und Methodennamen klein schreiben und nicht genau umgekehrt.

Dann merkst du dir einfach das Label und setzt auf diesem Label immer nur das bild neu.
Java:
import javax.swing.*;
import java.awt.*;

public class Test extends JFrame{
	
    static JButton btOK = new JButton("OK");
    static JButton btExit = new JButton("Ende");
    JPanel plButtons = new JPanel();
    JLabel imageLabel;
    
    Test () {
    	super("ein Test");
        plButtons.setLayout(new GridLayout(0,2));
        plButtons.add(btOK);
        plButtons.add(btExit);
        getContentPane().setLayout( new BorderLayout() );
        getContentPane().add("South", plButtons );
        setSize(10,20);
        imageLabel = new JLabel(new ImageIcon("bild2.jpg"));
        getContentPane().add("North", imageLabel);
    }

	public static void main(String[] args) throws Exception {
		Test wnd = new Test();
		wnd.setLocation(100, 100);
		wnd.setSize(300, 200);
		wnd.setVisible(true);
		Thread.sleep(1000);
		wnd.ausgabe();
	}

	public void ausgabe (){
        imageLabel.setIcon(new ImageIcon("bild1.jpg"));
        pack();
	}
}
 
Erstmal solltest du in Java Klassennamen groß und Methodennamen klein schreiben und nicht genau umgekehrt.

Dann merkst du dir einfach das Label und setzt auf diesem Label immer nur das bild neu.

Danke für den Hinweis. Ich werde künftig die Groß- und Kleinschreibung der Klassen und Methoden berücksichtigen. Das war mir nicht bewusst.

Genau da liegt ja das Problem. Wenn ich nur das bild neu setze, dann bleibt das alte Bild dort und das neue Bild wird nur daneben/darüber gesetzt.
 
Da muss ich mich entschuldigen. Ich hatte wohl deinen Code noch nicht kompiliert und noch meinen alten ausgeführt. :eek: Man merkt ich bin noch Anfänger. :eek:

Herzlichen dank für deine Hilfe !
 
Wenn ich die Methode ausgabe() jetzt mit einem Timer alle x Millisekunden ausführen möchte, sollte der Timer in der Theorie so ausschauen.
Java:
import java.util.*;

class Task  extends TimerTask  
{
    public void run()  
  {
      Ausgabe();
  }
}

public class TimerTaskDemo
{
  public static void main( String args[] )
  {
    Timer timer = new Timer();
    timer.schedule  ( new Task(), 2000 );  //alle 2 Sekunden
  }
}

Muss der Timer in einer eigenen Klasse stehen, oder kann ich ihn auch in meine Klasse Test() hineinschreiben ?
 
Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame {

	static JButton btOK = new JButton("OK");
	static JButton btExit = new JButton("Ende");
	JPanel plButtons = new JPanel( );
	JLabel imageLabel;

	Test() {
		super("ein Test");
		plButtons.setLayout(new GridLayout(0, 2));
		plButtons.add(btOK);
		plButtons.add(btExit);
		getContentPane( ).setLayout(new BorderLayout( ));
		getContentPane( ).add("South", plButtons);
		setSize(10, 20);
		imageLabel = new JLabel(new ImageIcon("bild2.jpg"));
		getContentPane( ).add("North", imageLabel);

		Timer timer = new Timer( );
		timer.schedule(new TimerTask( ) {

			@Override
			public void run() {
				ausgabe( );
			}
		}, TimeUnit.SECONDS.toMillis(2));
	}

	public static void main(String[] args) throws Exception {
		Test wnd = new Test( );
		wnd.setLocation(100, 100);
		wnd.setSize(300, 200);
		wnd.setVisible(true);
		Thread.sleep(1000);
	}

	public void ausgabe() {
		imageLabel.setIcon(new ImageIcon("bild1.jpg"));
		pack( );
	}
}

Prinzipiell sollte es so gehen. Da ein Timer jedoch seine Aufgaben in einem Thread ausführt musst du auf die Synchronisation achten:

Da weiss ich selber nicht genau wie das geht und hab auch keine Zeit mir das jetzt anzuschauen. Musst du mal selber lesen: http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
 
Zurück