Swing Layout während der Laufzeit anpassen

eiligerwind

Mitglied
Hallo Liebe Boardgemeinde,

ich versuche folgende Aufgabe zu lösen: Ein innen liegendes Panel, soll durch Radiobutton die in einem äußeren Panel liegen verändert werden. Die Layoutanpassungen sollen sich also nur auf das innere Panel auswirken. Mein bisheriger Code, sieht wie folgt aus:

Java:
package de.eiligerwind.Einsendeaufgabe2;

import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;


public class LayoutChangerGUI extends JFrame {
    //Von Eclipse automatisch vergebene Seriennummer
    
    private static final long serialVersionUID = 1L;
    //Die Komponenten drei Panels, Optionsfelder, Gruppe für die Optionsfelder, drei Labels, Button
    private JPanel panelRadiobuttons, panelLabelAnzeige, schaltflaechebeenden;
    private JRadioButton grid1, grid2, grid3;
    private ButtonGroup gruppeLayout;
    private JLabel erstesLabel, zweitesLabel, drittesLabel;
    private JButton beenden;
    
    //der Konstruktor
    
    public LayoutChangerGUI (String titel) {
        super(titel);
            
            //insgesamt drei Panels
        
            panelRadiobuttons = new JPanel();
            
            grid1 = new JRadioButton("Eine Spalte");
            grid2 = new JRadioButton("Zwei Spalten");
            grid3 = new JRadioButton("Drei Spalten");
            
            panelRadiobuttons.add(grid1);
            panelRadiobuttons.add(grid2);
            panelRadiobuttons.add(grid3);
            
            gruppeLayout = new ButtonGroup();
            
            grid1.setSelected(true);
            
            gruppeLayout.add(grid1);
            gruppeLayout.add(grid2);
            gruppeLayout.add(grid3);
                    
            panelRadiobuttons.setBorder(new TitledBorder("Das Layout ändern :"));
            
            //grid1.setSelected(true);
                    
            
            
            panelLabelAnzeige = new JPanel();
            
            erstesLabel = new JLabel("Erstes Label");
            zweitesLabel = new JLabel("Zweites Label");
            drittesLabel = new JLabel("Drittes Label");
                    
            erstesLabel.setBorder(new BevelBorder (BevelBorder.LOWERED));
            zweitesLabel.setBorder(new BevelBorder (BevelBorder.LOWERED));
            drittesLabel.setBorder(new BevelBorder (BevelBorder.LOWERED));
                    
            panelLabelAnzeige.add(erstesLabel);
            panelLabelAnzeige.add(zweitesLabel);
            panelLabelAnzeige.add(drittesLabel);
                    
            panelLabelAnzeige.setBorder(new TitledBorder("Label 1-3"));
        
            //ein Gridlayout mit einer Spalte und etwas Abstand
            //das Layout gilt jetzt nur für den "äußeren" Container
            
            setLayout(new GridLayout(0, 1, 10, 10));
            
            add(panelRadiobuttons);
            
            add(panelLabelAnzeige);
            
            beenden = new JButton("Beenden");   
            //daneben das zweite Panel
    
            schaltflaechebeenden = new JPanel();
            schaltflaechebeenden.add(beenden);
            schaltflaechebeenden.setBorder(new TitledBorder("Anwendung schließen"));
            //die Panels für die Schaltflächen einfügen
            add(schaltflaechebeenden);
            
                    
            //für die RadioButtons muss das für jeden Button passieren, nicht für die Gruppe!
            MeinListener listener= new MeinListener(panelLabelAnzeige);
            beenden.addActionListener(listener);
            grid1.addActionListener(listener);
            grid2.addActionListener(listener);
            grid3.addActionListener(listener);
        
            //die Standard-Aktion setzen
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //packen und anzeigen
            pack();
            setVisible(true);
                    
            //Größenänderungen sind nicht zugelassen
            //damit das mühsam erstellte Layout nicht durcheinander kommt
            setResizable(false);
                    
            }

    
            //Innere Klasse für den Listener
        class MeinListener implements ActionListener {
                
            private JPanel panelLabelAnzeige;
            
            public MeinListener(JPanel panelLabelAnzeige){
                this.panelLabelAnzeige = panelLabelAnzeige;
            }
        
            @Override
            public void actionPerformed(ActionEvent e) {
            //wurde auf Beenden geklickt?
            //dann das Programm beenden
            
                if(grid1.isSelected()==true); {
                    panelLabelAnzeige.setVisible(false);
                    panelLabelAnzeige.setLayout(new GridLayout(3,1));
                    panelLabelAnzeige.setVisible(true);
                    }
                
                if(grid2.isSelected()==true); {
                    panelLabelAnzeige.setVisible(false);
                    panelLabelAnzeige.setLayout(new GridLayout(1,2));
                    panelLabelAnzeige.setVisible(true);
                    panelLabelAnzeige.repaint();
                    }
                
                if(grid3.isSelected()==true); {
                    panelLabelAnzeige.setVisible(false);
                    panelLabelAnzeige.setLayout(new GridLayout(1,3));
                    panelLabelAnzeige.setVisible(true);
                    panelLabelAnzeige.repaint();
                }
                    
                if (e.getActionCommand().equals("Beenden")){
                       System.exit(0);
                    
                    }
                }
            }
        }

allerdings wird bei Auswahl der Radiobutton das Layout nicht wie gewünscht angepasst. Ich habe den ActionListener im Verdacht, kann den Fehler aber nicht finden 🙁... kann mir jemand die Tomaten von den Augen nehmen??

vielen Dank und viele Grüße
 
arghhh 😣... was so ein Semikolon ausmachen kann 😉... ich sage ja Tomaten auf den Augen (Danke für den Hinweis auf true...hatte das in meiner Verzweifelung gesetzt...natürlich hat das nichts verändert...) vielen Dank nun klappt es... musste noch in grid2 die Zeilenanzahl anpassen...

Problem solved 🙂
 
[CODE lang="java" title="Verbesserte Version Deines Codes"]import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JLabel;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class LayoutChangerGUI extends JFrame {
// Von Eclipse automatisch vergebene Seriennummer

private static final long serialVersionUID = 1L;
// Die Komponenten drei Panels, Optionsfelder, Gruppe für die Optionsfelder,
// drei Labels, Button

private static final int MAX_COLUMNS = 4;
private static final int PANEL_BUTTON = 0;
private static final int PANEL_LABEL = 1;
private static final int PANEL_EXIT = 2;

// private JPanel panelRadiobuttons, panelLabelAnzeige, schaltflaechebeenden;//
private JPanel[] panels = new JPanel[MAX_COLUMNS];
private JRadioButton[] buttons = new JRadioButton[MAX_COLUMNS];
private JLabel[] labels = new JLabel[MAX_COLUMNS];
private JButton beenden;

// der Konstruktor

public LayoutChangerGUI(String titel) {
super(titel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// insgesamt drei Panels

MeinListener listener = new MeinListener();
ButtonGroup gruppeLayout = new ButtonGroup();
for (int i = 0; i < MAX_COLUMNS; i++) {
panels = new JPanel();
buttons = new JRadioButton("Spaltenzahl: " + (i + 1));
buttons.addActionListener(listener);
panels[PANEL_BUTTON].add(buttons);
gruppeLayout.add(buttons);
}
buttons[0].setSelected(true);
panels[PANEL_BUTTON].setBorder(new TitledBorder("Das Layout ändern :"));
// grid1.setSelected(true);

createLabels(1);
panels[PANEL_LABEL].setBorder(new TitledBorder("Label 1-" + MAX_COLUMNS));

// ein Gridlayout mit einer Spalte und etwas Abstand
// das Layout gilt jetzt nur für den "äußeren" Container

setLayout(new GridLayout(0, 1, 10, 10));
add(panels[PANEL_BUTTON]);
add(panels[PANEL_LABEL]);
beenden = new JButton("Beenden");
// daneben das zweite Panel

panels[PANEL_EXIT].add(beenden);
panels[PANEL_EXIT].setBorder(new TitledBorder("Anwendung schließen"));
// die Panels für die Schaltflächen einfügen
add(panels[PANEL_EXIT]);

// für die RadioButtons muss das für jeden Button passieren, nicht für die
// Gruppe!

beenden.addActionListener(listener);
// die Standard-Aktion setzen
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// packen und anzeigen
pack();
setVisible(true);

// Größenänderungen sind nicht zugelassen
// damit das mühsam erstellte Layout nicht durcheinander kommt
setResizable(false);
}

/**
* Ändert das Layout des Label Panels.
*
* @param rows
* Anzahl Zeilen
* @param cols
* Anzahl Spalten
*/
public void changeGridLayout(int rows, int cols) {
panels[PANEL_LABEL].setVisible(false);
panels[PANEL_LABEL].removeAll();
panels[PANEL_LABEL].setLayout(new GridLayout(rows, cols));
createLabels(cols);
panels[PANEL_LABEL].setVisible(true);
panels[PANEL_LABEL].repaint();
}

/**
* Erzeugt die Labesl für den Label Panel.
*
* @param cnt
* Anzahl der Labels
*/
private void createLabels(int cnt) {
for (int i = 0; i < cnt; i++) {
labels = new JLabel("Label " + (1 + i));
labels.setBorder(new BevelBorder(BevelBorder.LOWERED));
labels.setHorizontalAlignment(JLabel.CENTER);
panels[PANEL_LABEL].add(labels);
}
}

// Innere Klasse für den Listener
class MeinListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// wurde auf Beenden geklickt?
// dann das Programm beenden
if (e.getActionCommand().equals("Beenden"))
System.exit(0);
changeGridLayout(1, getSelectdButtonNumber());
}

/**
* Ermittelt die Nummer des gewählten Buttons.
*
* @return
*/
private int getSelectdButtonNumber() {
for (int i = 0; i < buttons.length; i++)
if (buttons.isSelected())
return i + 1;
return 0;
}
}

}[/CODE]
 

Neue Themen


Zurück
Oben