JPanel zur Laufzeit austauschen



  • Hallo,
    ich habe in einem GridBagLayout unter anderm ein JPanel eingefügt. Zur Laufzeit möchte ich dieses JPanel nun durch ein anderes ersetzen.
    "tmpControlPanel" beinhaltet ein "Kontrollpult" mit mehreren ComboBoxen usw. Je nach den Einstellungen soll dann das dort eingefügte "jpSpecialControlPanel" durch die speziellen Kontrollelemente der JPanels "jpTerrainImage" oder "jpTerrainFractal" ersetzt werden.
    "itemStateChanged" wird aufgerufen, tauscht die JPanels aus und zeichnet das neu eingefügte KontrollPanel neu. Leider passiert optisch gar nichts.

    Hat jemand einen Tipp?

    [java]
    //
    // Abgespeckter Code
    //
    public class Java3DFrameWork extends JFrame implements ItemListener {
    private JPanel jpSpecialControlPanel = null;
    private JPanel jpTerrainImage = null;
    private JPanel jpTerrainFractal = null;

    public Java3DFrameWork(){
    CreateLayout();
    }

    private void CreateLayout(){
    // Kontrollfeld mit den allgemeinen Einstellmöglichkeiten
    JPanel tmpControlPanel = new JPanel();
    tmpControlPanel.setLayout(new BorderLayout());

    // Die speziellen Kontrollfelder der Generierungstypen anlegen
    jpTerrainImage = CreateLayoutTerrainImage();
    jpTerrainFractal = CreateLayoutTerrainFractal();
    jpSpecialControlPanel = jpTerrainImage;

    // Elemente und Layout anlegen
    GridBagLayout tmpGridBag = new GridBagLayout();
    GridBagConstraints tmpGridCons = new GridBagConstraints();

    // Das Hauptkontrollfeld (Panel) bestücken
    tmpControlPanel.setLayout(tmpGridBag);

    // Die konstanten GridBag-Daten setzen
    tmpGridCons.fill = GridBagConstraints.HORIZONTAL;
    tmpGridCons.insets = new Inseats(1, 5, 1, 5);
    tmpGridCons.gridx = 0;
    tmpGridCons.gridwidth = 2;
    tmpGridCons.gridheight = 1;

    // Die einzelnen Komponenten in das Layout einsetzen
    tmpGridCons.gridy = 7;
    tmpGridBag.setConstraints(jpSpecialControlPanel, tmpGridCons);
    tmpControlPanel.add(jpSpecialControlPanel);

    // Das Grundlayout erstellen
    this.getContentPane().setLayout(new BorderLayout());
    this.getContentPane().add("Center", cnvsCanvas3D);
    this.getContentPane().add("East", tmpControlPanel);
    }

    private JPanel CreateLayoutTerrainImage(){
    JPanel tmpTerrainImagePanel = new JPanel();
    ...
    return tmpTerrainImagePanel;
    }

    private JPanel CreateLayoutTerrainFractal(){
    JPanel tmpTerrainImagePanel = new JPanel();
    ...
    return tmpTerrainImagePanel;
    }

    public void itemStateChanged(ItemEvent MyEvent){
    if(MyEvent.getSource().equals(cmbTerrainTypes) && (MyEvent.getStateChange() == ItemEvent.SELECTED)){
    String tmpTerrainType = (String)MyEvent.getItem();

    if(tmpTerrainType.equals("Terrain aus Image")){
    jpSpecialControlPanel = CreateLayoutTerrainImage();
    } else if(tmpTerrainType.equals("Fraktales Terrain")){
    jpSpecialControlPanel = CreateLayoutTerrainFractal();
    }

    jpSpecialControlPanel.repaint();
    }
    }
    }[/code]



  • Du musst das Panel vor dem Referenzaustausch aus dem Container mittels remove entfernen und danach wieder einfügen.



  • Vielen Dank, ich werde es gleich ausprobieren.


Anmelden zum Antworten