LayoutManager Layout zur Laufzeit ändern

Megara

Mitglied
Hallo,

Ich sitze gerade etwas auf dem Schlauch. Ich soll für eine Aufgabe zur Laufzeit das Layout eines Panels ändern. Anhand von Radiobuttons soll das gewünschte Layout gewählt werden. Die Methoden setLayout und revalidate sind mir bekannt. Mir fehlt der Ansatz wie ich in meiner inneren Klasse auf das Panel panelLayout zugreifen soll um das Layout zu ändern.

Mein bisheriger Fortschritt:
Code:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

public class LayoutChangeGUI extends JFrame{

	//automatisch über Eclipse eingefügt
	private static final long serialVersionUID = 8880690754380988135L;

	private JRadioButton flowLayout, boxLayout, borderLayout, gridLayout;
	private String layout;

	public class RadioButtonListener implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			Object ausloeser = e.getSource();

			if(ausloeser instanceof JRadioButton){
				if(flowLayout.isSelected())
					//layout = "FlowLayout";
					System.out.println("FlowLayout");
				if(boxLayout.isSelected())
					//layout = "BoxLayout";
					System.out.println("BoxLayout");
				if(borderLayout.isSelected())
					//layout = "BorderLayout";
					System.out.println("BorderLayout");
				if(gridLayout.isSelected())
					//layout = "GridLayout";
					System.out.println("GridLayout");
			}
		}
	}

	public LayoutChangeGUI(String titel) {

		super(titel);

		JPanel panelOption, panelLayout;

		panelOption = panelOptionErzeugen();
		panelLayout = panelLayoutErzeugen();

		add(panelOption, BorderLayout.WEST);
		add(panelLayout, BorderLayout.EAST);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		pack();
		setVisible(true);

		setResizable(false);
	}

	private JPanel panelLayoutErzeugen() {
		JPanel tempPanel = new JPanel();

		JButton b1 = new JButton("Hallo");
		JButton b2 = new JButton("Welt");
		JButton b3 = new JButton("und");
		JButton b4 = new JButton("liebe");
		JButton b5 = new JButton("Menschen");
		
//		setPanelLayout(1);

		tempPanel.add(b1);
		tempPanel.add(b2);
		tempPanel.add(b3);
		tempPanel.add(b4);
		tempPanel.add(b5);

		tempPanel.setBorder(new TitledBorder("Layout: " + layout));

		return tempPanel;
	}

//	private void setPanelLayout(int auswahl) {
//		
//		switch(auswahl){
//		case 1:
//			System.out.println("FlowLayout");
//			break;
//		case 2:
//			System.out.println("BoxLayout");
//			break;
//		case 3:
//			System.out.println("BorderLayout");
//			break;
//		case 4:
//			System.out.println("GridLayout");
//			break;
//		}
//	}

	private JPanel panelOptionErzeugen() {
		JPanel tempPanel = new JPanel();

		flowLayout = new JRadioButton("FlowLayout");
		boxLayout = new JRadioButton("BoxLayout");
		borderLayout = new JRadioButton("BorderLayout");
		gridLayout = new JRadioButton("GridLayout");

		ButtonGroup gruppe = new ButtonGroup();
		gruppe.add(flowLayout);
		gruppe.add(boxLayout);
		gruppe.add(borderLayout);
		gruppe.add(gridLayout);

		flowLayout.setSelected(true);

		RadioButtonListener meinListener = new RadioButtonListener();
		flowLayout.addItemListener(meinListener);
		boxLayout.addItemListener(meinListener);
		borderLayout.addItemListener(meinListener);
		gridLayout.addItemListener(meinListener);

		tempPanel.setLayout(new GridLayout(0,1));
		tempPanel.add(flowLayout);
		tempPanel.add(boxLayout);
		tempPanel.add(borderLayout);
		tempPanel.add(gridLayout);

		tempPanel.setBorder(new TitledBorder("Layoutauswahl: "));

		return tempPanel;
	}

}

Danke sehr,
Gruß,
Megara
 
Aus dem Constructor nimmste du JPanel panelOption, panelLayout; raus und nimmst diese als Attribute

dann baust du dir ne methode in etwa so:

Java:
private void setMyLayout(LayoutManager layout){
		this.panelLayout.setLayout(layout);
		validate();
	}

und diese rufst du dann in der inneren klasse auf
 
in der

public class LayoutChangeGUI

denn sobald der constructor durchlaufen wurde sind se ja weg und du müsstest das ganze panal durchsuchen um das eine panel zu finden bei welchem du das layout ändern willst
 
Mein geänderter Quellcode:

Code:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

public class LayoutChangeGUI extends JFrame{

	//automatisch über Eclipse eingefügt
	private static final long serialVersionUID = 8880690754380988135L;

	private JRadioButton flowLayout, boxLayout, borderLayout, gridLayout;
	private JPanel panelLayout;

	public class RadioButtonListener implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			Object ausloeser = e.getSource();

			if(ausloeser instanceof JRadioButton){
				if(flowLayout.isSelected()){
					setMyLayout(1);
					System.out.println("FlowLayout");
				}
				if(boxLayout.isSelected()){
					setMyLayout(2);
					System.out.println("BoxLayout");
				}
				if(borderLayout.isSelected()){
					setMyLayout(3);
					System.out.println("BorderLayout");
				}
				if(gridLayout.isSelected()){
					setMyLayout(4);
					System.out.println("GridLayout");
				}
			}
		}
	}

	public LayoutChangeGUI(String titel) {

		super(titel);

		JPanel panelOption, panelLayout;

		panelOption = panelOptionErzeugen();
		panelLayout = panelLayoutErzeugen();

		add(panelOption, BorderLayout.WEST);
		add(panelLayout, BorderLayout.EAST);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		pack();
		setVisible(true);

		setResizable(false);
	}

	private JPanel panelLayoutErzeugen() {
		JPanel tempPanel = new JPanel();
		
		setMyLayout(1);

		return tempPanel;
	}

	private void setMyLayout(int auswahl) {
		
		String layout = null;
		
		JButton b1 = new JButton("Hallo");
		JButton b2 = new JButton("Welt");
		JButton b3 = new JButton("und");
		JButton b4 = new JButton("liebe");
		JButton b5 = new JButton("Menschen");
		
		switch(auswahl){
		case 1:
			this.panelLayout.setLayout(new FlowLayout());
			this.panelLayout.add(b1);
			this.panelLayout.add(b2);
			this.panelLayout.add(b3);
			this.panelLayout.add(b4);
			this.panelLayout.add(b5);
			layout = "FlowLayout";
			break;
		case 2:
			this.panelLayout.setLayout(new BoxLayout(panelLayout,BoxLayout.Y_AXIS));
			this.panelLayout.add(b1);
			this.panelLayout.add(b2);
			this.panelLayout.add(b3);
			this.panelLayout.add(b4);
			this.panelLayout.add(b5);
			layout = "BoxLayout";
			break;
		case 3:
			this.panelLayout.setLayout(new BorderLayout(5,5));
			this.panelLayout.add(b1, BorderLayout.PAGE_START);
			this.panelLayout.add(b2, BorderLayout.LINE_START);
			this.panelLayout.add(b3);
			this.panelLayout.add(b4, BorderLayout.LINE_END);
			this.panelLayout.add(b5, BorderLayout.PAGE_END);
			layout = "BorderLayout";
			break;
		case 4:
			this.panelLayout.setLayout(new GridLayout(3,2));
			this.panelLayout.add(b1);
			this.panelLayout.add(b2);
			this.panelLayout.add(b3);
			this.panelLayout.add(b4);
			this.panelLayout.add(b5);
			layout = "GridLayout";
			break;
		}
		this.panelLayout.setBorder(new TitledBorder("Layout: " + layout));
		validate();
	}

	private JPanel panelOptionErzeugen() {
		JPanel tempPanel = new JPanel();

		flowLayout = new JRadioButton("FlowLayout");
		boxLayout = new JRadioButton("BoxLayout");
		borderLayout = new JRadioButton("BorderLayout");
		gridLayout = new JRadioButton("GridLayout");

		ButtonGroup gruppe = new ButtonGroup();
		gruppe.add(flowLayout);
		gruppe.add(boxLayout);
		gruppe.add(borderLayout);
		gruppe.add(gridLayout);

		flowLayout.setSelected(true);

		RadioButtonListener meinListener = new RadioButtonListener();
		flowLayout.addItemListener(meinListener);
		boxLayout.addItemListener(meinListener);
		borderLayout.addItemListener(meinListener);
		gridLayout.addItemListener(meinListener);

		tempPanel.setLayout(new GridLayout(0,1));
		tempPanel.add(flowLayout);
		tempPanel.add(boxLayout);
		tempPanel.add(borderLayout);
		tempPanel.add(gridLayout);

		tempPanel.setBorder(new TitledBorder("Layoutauswahl: "));

		return tempPanel;
	}

}

Erhalte folgende Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at LayoutChangeGUI.setMyLayout(LayoutChangeGUI.java:100)
at LayoutChangeGUI.panelLayoutErzeugen(LayoutChangeGUI.java:83)
at LayoutChangeGUI.<init>(LayoutChangeGUI.java:67)
at LayoutChangeMain.main(LayoutChangeMain.java:13)
 
warum so umständlich??

Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.LayoutStyle;
import javax.swing.border.TitledBorder;

public class test extends JFrame{
	
	//<---Als Attribut Deklarieren
	JPanel panelOption, panelLayout;
	//--->
	
	public static void main(String[] args){
		new test("name");
	}

	//automatisch über Eclipse eingefügt
	private static final long serialVersionUID = 8880690754380988135L;

	private JRadioButton flowLayout, boxLayout, borderLayout, gridLayout;
	private String layout;

	public class RadioButtonListener implements ItemListener {

		@Override
		public void itemStateChanged(ItemEvent e) {
			Object ausloeser = e.getSource();

			if(ausloeser instanceof JRadioButton){
				if(flowLayout.isSelected())
					//layout = "FlowLayout";
					System.out.println("FlowLayout");
				if(boxLayout.isSelected())
					//layout = "BoxLayout";
					System.out.println("BoxLayout");
				if(borderLayout.isSelected())
					//layout = "BorderLayout";
					System.out.println("BorderLayout");
				if(gridLayout.isSelected()){
					//layout = "GridLayout";
					
					//<--- Methoden Aufruf zum setzten des Layouts
					setMyLayout(new GridLayout(5,0));
					//--->
					
					System.out.println("GridLayout");
				}
			}
		}
	}

	public test(String titel) {

		super(titel);

		panelOption = panelOptionErzeugen();
		panelLayout = panelLayoutErzeugen();

		add(panelOption, BorderLayout.WEST);
		add(panelLayout, BorderLayout.EAST);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		pack();
		setVisible(true);

		setResizable(false);
	}
	
	//<----Einfügen
	private void setMyLayout(LayoutManager layout){
		this.panelLayout.setLayout(layout);
		validate();
	}
	//----->

	private JPanel panelLayoutErzeugen() {
		JPanel tempPanel = new JPanel();

		JButton b1 = new JButton("Hallo");
		JButton b2 = new JButton("Welt");
		JButton b3 = new JButton("und");
		JButton b4 = new JButton("liebe");
		JButton b5 = new JButton("Menschen");
		
//		setPanelLayout(1);

		tempPanel.add(b1);
		tempPanel.add(b2);
		tempPanel.add(b3);
		tempPanel.add(b4);
		tempPanel.add(b5);

		tempPanel.setBorder(new TitledBorder("Layout: " + layout));

		return tempPanel;
	}

	private JPanel panelOptionErzeugen() {
		JPanel tempPanel = new JPanel();

		flowLayout = new JRadioButton("FlowLayout");
		boxLayout = new JRadioButton("BoxLayout");
		borderLayout = new JRadioButton("BorderLayout");
		gridLayout = new JRadioButton("GridLayout");

		ButtonGroup gruppe = new ButtonGroup();
		gruppe.add(flowLayout);
		gruppe.add(boxLayout);
		gruppe.add(borderLayout);
		gruppe.add(gridLayout);

		flowLayout.setSelected(true);

		RadioButtonListener meinListener = new RadioButtonListener();
		flowLayout.addItemListener(meinListener);
		boxLayout.addItemListener(meinListener);
		borderLayout.addItemListener(meinListener);
		gridLayout.addItemListener(meinListener);

		tempPanel.setLayout(new GridLayout(0,1));
		tempPanel.add(flowLayout);
		tempPanel.add(boxLayout);
		tempPanel.add(borderLayout);
		tempPanel.add(gridLayout);

		tempPanel.setBorder(new TitledBorder("Layoutauswahl: "));

		return tempPanel;
	}

}
 
Habe meinen Quellcode anhand deinem erweitert. Bekomme nicht alle "neuen" Layouts angezeigt und BoxLayout erwartet als Parameter einen Container aber im Listener kann ich nicht auf das entsprechende Panel zugreifen.

Code:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;
 
public class LayoutChangeGUI extends JFrame{
    
    
 
    //automatisch über Eclipse eingefügt
    private static final long serialVersionUID = 8880690754380988135L;
 
    private JRadioButton flowLayout, boxLayout, borderLayout, gridLayout;
    private String layoutTitel;
    private JPanel panelOption, panelLayout;
 
    public class RadioButtonListener implements ItemListener {
 
        @Override
        public void itemStateChanged(ItemEvent e) {
            Object ausloeser = e.getSource();
 
            if(ausloeser instanceof JRadioButton){
                if(flowLayout.isSelected())
                    layoutTitel = "FlowLayout";
                    setMyLayout(new FlowLayout());
                    System.out.println("FlowLayout");
                if(boxLayout.isSelected())
                    layoutTitel = "BoxLayout";
                    //setMyLayout(new BoxLayout(BoxLayout.Y_AXIS));
                    System.out.println("BoxLayout");
                if(borderLayout.isSelected())
                    layoutTitel = "BorderLayout";
                    setMyLayout(new BorderLayout(2,3));
                    System.out.println("BorderLayout");
                if(gridLayout.isSelected()){
                    layoutTitel = "GridLayout";
                    setMyLayout(new GridLayout(2,3));
                    System.out.println("GridLayout");
                }
            }
        }
    }
 
    public LayoutChangeGUI(String titel) {
 
        super(titel);
 
        panelOption = panelOptionErzeugen();
        panelLayout = panelLayoutErzeugen();
 
        add(panelOption, BorderLayout.WEST);
        add(panelLayout, BorderLayout.EAST);
 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        pack();
        setVisible(true);
 
        setResizable(false);
    }

    private void setMyLayout(LayoutManager layout){
        this.panelLayout.setLayout(layout);
        this.panelLayout.setBorder(new TitledBorder("Layout: " + layoutTitel));
        validate();
    }
 
    private JPanel panelLayoutErzeugen() {
        JPanel tempPanel = new JPanel();
 
        JButton b1 = new JButton("Hallo");
        JButton b2 = new JButton("Welt");
        JButton b3 = new JButton("und");
        JButton b4 = new JButton("liebe");
        JButton b5 = new JButton("Menschen");
        
        tempPanel.setLayout(new FlowLayout());
        tempPanel.setBorder(new TitledBorder("Layout: " + "FlowLayout"));
        
        tempPanel.add(b1);
        tempPanel.add(b2);
        tempPanel.add(b3);
        tempPanel.add(b4);
        tempPanel.add(b5);
        
        return tempPanel;
    }
 
    private JPanel panelOptionErzeugen() {
        JPanel tempPanel = new JPanel();
 
        flowLayout = new JRadioButton("FlowLayout");
        boxLayout = new JRadioButton("BoxLayout");
        borderLayout = new JRadioButton("BorderLayout");
        gridLayout = new JRadioButton("GridLayout");
 
        ButtonGroup gruppe = new ButtonGroup();
        gruppe.add(flowLayout);
        gruppe.add(boxLayout);
        gruppe.add(borderLayout);
        gruppe.add(gridLayout);
 
        flowLayout.setSelected(true);
 
        RadioButtonListener meinListener = new RadioButtonListener();
        flowLayout.addItemListener(meinListener);
        boxLayout.addItemListener(meinListener);
        borderLayout.addItemListener(meinListener);
        gridLayout.addItemListener(meinListener);
 
        tempPanel.setLayout(new GridLayout(0,1));
        tempPanel.add(flowLayout);
        tempPanel.add(boxLayout);
        tempPanel.add(borderLayout);
        tempPanel.add(gridLayout);
 
        tempPanel.setBorder(new TitledBorder("Layoutauswahl: "));
 
        return tempPanel;
    }
 
}
 
Schau mal auf deine Console wenn du das Layout ändern willst da werden immer mehrere Sysouts gemacht du hast in Deiner ListenerClass nach jedem if die {} vergessen.
So am rande - du solltest auch mal else if nutzen und nicht nur if, da ja eh nur eine Auswahl besteht macht das kein sinn und kostet nur Rechenzeit.


So dann zu der stelle wo du die Beiden Panels setzt

Java:
add(panelOption, BorderLayout.WEST);
//hier bitte Center sonst bekommst du in der Mitte eine Lücke
add(panelLayout, BorderLayout.CENTER);

sollte jetzt alles laufen
 

Zurück
Oben