• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Swing: Panel austauschen, Anfängerfrage?

spunti

Hacker
Hallo Kollegen,

ich hab eine Klasse von Frame, die mein Swing-Programm darstellt. Da hab ich automatisch auch ein Panel drin, worauf ich einen Button gesetzt hab.
Wenn ich diesen Button drücke, will ich das Panel austauschen, weil eine andere Bildschirmmaske aufgebaut werden soll.

Das neue Panel ist übersichtshalber eine eigene Klasse. Der Austausch ist kein Problem, aber wenn ich jetzt dieses neue Panel wieder austauschen will, klicke ich ja in der neuen Klasse rum und kann das ursprüngliche Frame nicht mehr ansprechen.

Wie löst man so ein Problem?
Ich kann ja erst mal alle Panels in eine Klasse schreiben, die irgendwann in dem Frame erscheinen sollen, aber das muß doch auch besser gehen.
Bei den Swing-Tutorials wird sowas leider nie behandelt, da wird höchstens mal ein Text oder sowas ausgegeben, aber nie der gesamte Panelaufbau verändert.

danke
spunti
 

perdian

Newbie
Ich weiss nicht, ob ich dich 100% richtig verstanden habe, aber du musst dir halt irgendwo die Referenzen halten, wo du wieder mit auf das Frame, das Panel oder was auch immer zurückkommst.

Beispielsweise so:
Code:
package de.perdian.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PanelTest {

  public static void main(String[] args) {
    TheFrame frame      = TheFrame.getInstance();
    frame.setContentPane(new ThePanel1());
    frame.setBounds(10, 10, 200, 200);
    frame.setVisible(true);
  }

}

class TheFrame extends JFrame {
  
  private static TheFrame myInstance     = new TheFrame();
  
  /**
   * Private singleton constructor
   */
  private TheFrame() {
  }
  
  /**
   * Gets the globall singleton instance
   */
  public static TheFrame getInstance() {
    return TheFrame.myInstance;
  }
  
}

class ThePanel1 extends JPanel {
  public ThePanel1() {
    super(new BorderLayout());
    JButton button1     = new JButton(new AbstractAction("Panel2 anzeigen") {
      public void actionPerformed(ActionEvent e) {
        TheFrame frame  = TheFrame.getInstance();
        frame.setContentPane(new ThePanel2());
        frame.validate();
        frame.repaint();
      }
    });
    this.add(button1, BorderLayout.CENTER);
  }
}

class ThePanel2 extends JPanel {
  public ThePanel2() {
    super(new BorderLayout());
    JButton button2     = new JButton(new AbstractAction("Zurück zu Panel 1") {
      public void actionPerformed(ActionEvent e) {
        TheFrame frame  = TheFrame.getInstance();
        frame.setContentPane(new ThePanel1());
        frame.validate();
        frame.repaint();
      }
    });
    this.add(button2, BorderLayout.CENTER);
  }
}
 
OP
S

spunti

Hacker
Danke, das probier ich demnächst mal aus.
Im Moment zeichne ich erst mal alles, was ich jemals angezeigt werden könnte in ein Panel und mach alles unsichbar, was nicht gezeigt werden soll.

spunti
 
OP
S

spunti

Hacker
Das funktioniert tatsächlich. Damit krieg ich dann endlich eine vernünftige Sturktur in mein Programm.
Danke noch mal
spunti
 
Oben