Swing Layout während der Laufzeit anpassen

E

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
 
E

eiligerwind

Mitglied
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 :)
 
Blender3D

Blender3D

Top Contributor
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[i] = new JPanel();
            buttons[i] = new JRadioButton("Spaltenzahl: " + (i + 1));
            buttons[i].addActionListener(listener);
            panels[PANEL_BUTTON].add(buttons[i]);
            gruppeLayout.add(buttons[i]);
        }
        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[i] = new JLabel("Label " + (1 + i));
            labels[i].setBorder(new BevelBorder(BevelBorder.LOWERED));
            labels[i].setHorizontalAlignment(JLabel.CENTER);
            panels[PANEL_LABEL].add(labels[i]);
        }
    }

    // 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[i].isSelected())
                    return i + 1;
            return 0;
        }
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
N Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2
D LayoutManager Main layout auf andere Class Dateien verweisen? AWT, Swing, JavaFX & SWT 17
B Probleme mit Layout Manager (BoxLayout) AWT, Swing, JavaFX & SWT 4
F Zeichnung verschwindet bei Nutzung von einem Layout AWT, Swing, JavaFX & SWT 6
A SWT Layout Problem AWT, Swing, JavaFX & SWT 15
S SWT Composite mit Layout Manager geht nicht AWT, Swing, JavaFX & SWT 4
C Bestimmtes Layout gesucht AWT, Swing, JavaFX & SWT 6
F GridBagLayout layout alignment AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben