Aktualisierung JFrame

flashOr

Erfahrenes Mitglied
Hallo,

ich möchte ganz einfach in einem JFrame einen JPanel gegen einen anderen austauschen. Nur leider wird das JFrame nicht aktualisiert. Prinzipiell hab ich mir gedacht, ich schmeiße zuerst alle Komponenten aus dem JFrame raus und dann die neuen rein. Allerdings funktioniert dies nicht dynamisch also unabhängig davon was bereits drin liegt. Wenn ich jedoch das bisherige JPanel mit this.remove(panel1) rausnehme klappt es. Wo liegt das Problem?

PS: Wie kann ich den Java Code im Forum schön bunt machen?

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


public class GuiLayout extends JFrame implements ActionListener {

	private JButton start, btnBack;
	private JPanel panel1, panel2;
	
	public GuiLayout() {
		super("Layout Test");
		this.initComponents();
		this.setSize(500,500);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	public void initComponents() { 
		panel1 = new JPanel();
		start = new JButton("start");
		start.addActionListener(this);
		panel1.add(start);
		this.add(panel1);
	}
	
	public void initComponents2() {
		removeComponents();
		panel2 = new JPanel(new FlowLayout());
		btnBack = new JButton("zurück");
		JLabel lblMessage = new JLabel("Neu");
		panel2.add(lblMessage);
		panel2.add(btnBack);
		this.add(panel2);
		this.invalidate();
	}
	
	public void removeComponents() {
		int len = this.getComponentCount();
		for(int i=0;i<len;i++) {
			this.remove(i);
		}
	}

	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == start) {
			initComponents2();
			this.invalidate();
			this.validate();			
		}
	}
	
	public static void main(String args[]) {
		GuiLayout g = new GuiLayout();
	}
	
	
}
 
probiers mal schlicht per
this.repaint();
bzw auch
panel.repaint();

diese solltest du einbauen in den initComponents und removeComponents-Methoden. probiers allerdings erstmal nur mit dem repainten des JFrames, das sollte genügen.

alternativ könnte man das JFrame auch unsichtbar und wieder sichtbar machen, aber dann wird der Size des JFrames auf den Standart-Size gesetzt.
In jedem Fall muss das JFrame auf irgendeine Weise manuell aktualisiert werden.
 
Zuletzt bearbeitet:
this.repaint() bringt leider überhaupt nix. Im JFrame bleibt einfach nur der Button gedrückt und nix geht mehr.
 
Heyho,

hast du mal validate(); am Frame ausprobiert!?
hat mir zumindest mal geholfen... :)

Grüße
Felix
 
Ansonsten versuch doch mal ganz blöd setVisible(false); und nach den Befehlen setVisible(true);

so etwa:
Java:
panel.setVisible(false);
// hier dein Code - ändern der Elemente etc.
panel.setVisible(true);
Für solche Geschichten ist eigentlich immer validate();
Aber ich musste schonmal die doofe Variante verwenden, weil validate(); nicht funktioniert hat :)

Grüße
Felix

Edit:
Mir ist gerade aufgefallen, wie du die Elemente entfernst... bist du dir sicher, dass das funktioniert!? ich habe es an einem Beispielapp getestet und habe genau deinen Fehler...
 
Zuletzt bearbeitet:
@Inkog: Danke, ich hab die eigene Methode verwendet weil der Fehler zuerst auftrat bei removeAll()

@Wyatt: Also wenn ich es mit this.setVisible() mache, dann verschwindet zumindest der Button und ich habe dann ein graues JFrame. Was aber auch nicht ganz mein Ziel war. Wie soll man denn sonst Komponenten aus einen JFrame entfernen?

Die Aufgabe kann doch nicht so schwierig sein, ich verstehe nicht warum so etwas so viel Schwierigkeiten bereitet. Wie würdet ihr denn so eine Navigation umsetzen?
 
Heyho,

ich hab das nun mal binnen 5 Minuten selber versucht und das ist mein Ergebnis
Java Code mit [ java] code [ /java ]

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Flash extends JFrame {
  // Anfang Variablen
  private JPanel jPanel1 = new JPanel(null);
  private JButton jButton1 = new JButton();
  private JPanel jPanel2 = new JPanel(null);
  private JButton jButton2 = new JButton();
  // Ende Variablen

  public Flash(String title) {
    // Frame-Initialisierung
    super(title);
    setSize(300, 300);
    setLocation(5, 5);
    Container cp = getContentPane();
    cp.setLayout(null);
    setVisible(true); // Frame sichtbar machen

    // Anfang Komponenten
    // Panel 1
    jPanel1.setBounds(16, 8, 257, 249);
    jPanel1.setBackground(Color.YELLOW);
    cp.add(jPanel1);
    
    jButton1.setBounds(56, 176, 145, 49);
    jButton1.setText("Start");
    jPanel1.add(jButton1);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });

    // Panel 2
    jPanel2.setBounds(16, 8, 257, 249);
    jPanel2.setBackground(Color.MAGENTA);
    cp.add(jPanel2);
    
    jButton2.setBounds(56, 176, 145, 49);
    jButton2.setText("Zurück");
    jPanel2.add(jButton2);
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton2ActionPerformed(evt);
      }
    });
    // Ende Komponenten
    
    jPanel1.setVisible(true); // Panel1 sichtbar machen
    jPanel2.setVisible(false); // Panel2 unsichtbar machen
  }

  // Anfang Ereignisprozeduren
  public void jButton1ActionPerformed(ActionEvent evt) {
    jPanel1.setVisible(false); // Panel1 unsichtbar machen
    jPanel2.setVisible(true); // Panel2 sichtbar machen
  }

  public void jButton2ActionPerformed(ActionEvent evt) {
    jPanel1.setVisible(true); // Panel1 sichtbar machen
    jPanel2.setVisible(false); // Panel2 unsichtbar machen
  }
  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new Flash("Flash");
  }
}

Hattest du dir das so vorgestellt?!
Vielleicht hilft es ja :)

Ciao
Felix
 
Moin!
Wenn man zwischen den Inhalten eines Containers hin- und herschalten möchte, bietet es sich eher an, das mit einem CardLayout zu realisieren.
Das Beispiel von oben, ein wenig abgewandelt:
Code:
      import java.awt.*;
   
     import java.awt.event.*;
   
      import javax.swing.*;
   
       
   
     public class Flash extends JFrame {
   
        // Anfang Variablen
        private CardLayout cards = null;
        private JPanel jPanel1 = new JPanel(null);
   
        private JButton jButton1 = new JButton();
   
        private JPanel jPanel2 = new JPanel(null);
  
        private JButton jButton2 = new JButton();
  
        // Ende Variablen
  
       
          public Flash(String title) {
  
          // Frame-Initialisierung
  
          super(title);
          setSize(300, 300);
  
          setLocation(5, 5);
  
          Container cp = getContentPane();
          cards = new CardLayout();
          cp.setLayout(cards);
  
          setVisible(true); // Frame sichtbar machen
  
       
  
          // Anfang Komponenten
  
          // Panel 1
          jPanel1.setSize(257, 249);
  
          jPanel1.setBackground(Color.YELLOW);
          
          
         
  
          jButton1.setBounds(56, 176, 145, 49);
  
          jButton1.setText("Start");
  
          jPanel1.add(jButton1);
  
          jButton1.addActionListener(new ActionListener() {
  
            public void actionPerformed(ActionEvent evt) {
  
              jButton1ActionPerformed(evt);
  
            }
  
          });
  
       
  
          // Panel 2
          
          jPanel2.setSize(16, 8);
  
          jPanel2.setBackground(Color.MAGENTA);
  
          
  
          jButton2.setBounds(56, 176, 145, 49);
  
          jButton2.setText("Zurück");
  
          jPanel2.add(jButton2);
  
          jButton2.addActionListener(new ActionListener() {
  
            public void actionPerformed(ActionEvent evt) {
  
              jButton2ActionPerformed(evt);
  
            }
  
          });
          cp.add(jPanel1,"panel1");
          cp.add(jPanel2,"panel2");
          
          cards.show(cp, "panel1");
  
        }
  
       
  
        // Anfang Ereignisprozeduren
  
        public void jButton1ActionPerformed(ActionEvent evt) {
            cards.show(this.getContentPane(), "panel2");
  
        }
  
      
  
      public void jButton2ActionPerformed(ActionEvent evt) {
  
            cards.show(this.getContentPane(), "panel1");
  
        }
  
        // Ende Ereignisprozeduren
  
       
  
        public static void main(String[] args) {
  
          new Flash("Flash");
  
        }
  
      }

*grüssle*
MeinerEiner
 
Zurück