Panel austauschen - Anfängerfrage

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,
weil es um Swing geht, poste ich die Frage hier.

Ich habe einen JFrame und ein JPanel, das ich auf BorderLayout.CENTER gelegt habe.
Code:
public class PanelTauscher{
	JFrame frame;
	public PanelTauscher(){
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new BorderLayout());
		
		JButton button = new JButton("tausche panel");
		button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				// wie tausche ich das CENTER panel durch ein anderes panel
			}
		});
		
		JPanel panel1 = new JPanel();
		panel1.add(new JLabel("Das ist panel 1"));
		
		frame.add(button,BorderLayout.NORTH);
		frame.add(panel1,BorderLayout.CENTER);		
		
		frame.pack();
		frame.setSize(640, 480);
		frame.setVisible(true);
	}	
	
	public static void main(String[]argv){	
		new PanelTauscher();
	}	
}

Wenn ich jetzt panel1 durch Knopfdruck austauschen möchte, wie mache ich das?
Reicht es wenn ich in der actionPerformed Methode einfach schreibe:
Code:
this.add(panel[b]2[/b],BorderLayout.CENTER);

Oder muss ich da noch was revalidieren?
 

Marco13

Top Contributor
Nach Änderungen an sichtbaren Components muss man i.a. (wenn sie das Layout beeinflussen) auf jeden Fall "validate()" aufrufen. Es müßte in dem Fall schon reichen, das neue Panel mit
this.add(panel2,BorderLayout.CENTER);
hinzuzufügen, weil im CENTER nur eine Component liegen kann, und diese demnach ersetzt werden müßte. Auf der sicheren Seite wäre man, wenn man das alte Panel erst entfernen würden. Müßte man ggf. mal im Quellcode nachsehen (wobei in der Deku diesbezüglich anscheinend nichts spezifiziert ist....)
 
A

anderer Gast

Gast
Was mache ich aber, wenn ich nicht weiss, welches JPanel im Moment im CENTER liegt, bzw. wie kann ich das vom Frame erfragen? Oder gibt es die Möglichkeit, den CENTER-Bereich des BorderLayouts direkt anzusprechen (zu löschen), unabhängig davon, welches Panel da nun drin liegt?
 

Marco13

Top Contributor
OK, hab mal nachgeguckt: Wenn man
panel.add(comp0, BorderLayout.CENTER);
panel.add(comp1, BorderLayout.CENTER);
macht, liegen dort wirklich ZWEI Components, und es kommt Mist raus (hätte man sich eigentlich denken können, aber anhand der Doku konnte man IMHO nicht 100% sicher sein).

Es gibt dann zumindest 2 Möglichkeiten: Entweder, man merkt sich, welche Component man ins Center gelegt hat...
Code:
class Foo
{
    private Component currentCenterComponent = null;

    public void addToCenter(Component component)
    {
        if (currentCenterComponent != null)
        {
            panel.remove(currentCenterComponent);
        }
        currentCenterComponent = component;
        if (currentCenterComponent != null)
        {
            panel.add(currentCenterComponent, BorderLayout.CENTER);
        }
        panel.validate();
}
oder man legt die Component in eine andere, die immer fest im CENTER liegt
Code:
class Foo
{
    private Component centerContainer = new JPanel(new GridLayout(0,0));

    public Foo()
    {
        ....
        panel.add(centerContainer, BorderLayout.CENTER);
    }

    public void change()
    {
        centerContainer.removeAll();
        centerContainer.add(theNewPanel);
        panel.validate(); 
    }

}
 
A

anderer Gast

Gast
Danke. Das mit dem Extra-Panel im CENTER-Bereich des Frame scheint mir die bessere Möglichkeit. Das .validate() des Panel alleine reicht aber wohl nicht, ich muss auch noch zusätzlich ein .repaint() ausführen, dann klappt es problemlos.
 
A

anderer Gast

Gast
Das .repaint() kann man wohl doch auch weglassen...

Mir ist aber auch noch aufgefallen, dass das .removeAll() auch das BorderLayout des alten Panels entfernt. Das muss ich nach dem entfernen dann erst wieder hinzufügen, da sonst mein neues Panel nicht in den ganzen CENTER-Bereich ausgedehnt wird, sondern nur klein zentriert in der Mitte ist.

Also, in meinem Hauptmenue sieht es dann so aus:

Code:
[...]

if (e.getActionCommand().equals("Personen anzeigen")) {
			hauptframe.hauptPanel.removeAll();
			hauptframe.hauptPanel.setLayout(new BorderLayout(5,5));
			hauptframe.hauptPanel.add(new PersonenListePanel());
			hauptframe.hauptPanel.validate();
		}

[...]


Dann in der Klasse PersonenListePanel muss ich aber auch nochmal das BorderLayout setzen... Dort kommt ein JScrollPane mit JTable (und mit TableModel) in den CENTER-Bereich. Wenn eins der beiden hier genannten BorderLayouts fehlt, wird die Tabelle nur klein zentriert in der Mitte des Panels angezeigt.

Code:
[...]

public class PersonenListePanel extends JPanel {

[...]

setLayout(new BorderLayout(5,5));

[...]

Irgendwie hab ich auch das Gefühl, dass das Anzeigen des neuen Panels nach dem Klick auf den Menüpunkt relativ langsam geht. Vielleicht gibt es doch noch eine bessere Lösung. Mit dem zweimal Setzen des BorderLayouts bin ich auch nicht so ganz zufrieden.
 

Marco13

Top Contributor
Das sollte auch nicht nötig sein. Mit removeAll werden alle Components entfernt, aber nicht das Layout! Poste ggf. mal ein compilierbares Codestückchen, wo das Problem auftritt...
 
A

anderer Gast

Gast
Hmm, ich versuch mal den Code der betroffenen Klassen zu posten...


Zuerst mal die KLasse mit dem Menü:
Code:
public class HauptMenue extends JMenuBar implements ActionListener {
	
	HauptFrame hauptframe;
	
	
	public HauptMenue(HauptFrame hauptframe) {
		
		this.hauptframe = hauptframe;

		JMenu m;
		JMenuItem mi;

		m = new JMenu("Person");
		mi = new JMenuItem("neue Person...");
		mi.setActionCommand("neuePerson");
		mi.addActionListener(this);
		m.add(mi);
		m.add(new JMenuItem("Person laden"));
		
		mi = new JMenuItem("Personen anzeigen");
		mi.addActionListener(this);
		m.add(mi);
		
		m.addSeparator();
		m.add(new JMenuItem("Schliessen"));
		m.addSeparator();
		m.add(new JMenuItem("Persondaten speichern"));
		m.addSeparator();
		mi = new JMenuItem("Beenden");
		mi.setActionCommand("Beenden");
		mi.addActionListener(this);
		m.add(mi);

		add(m);
		
		m = new JMenu("Antrag");
		
		add(m);
		
		m = new JMenu("Statistik");
		
		add(m);
		
		m = new JMenu("Einstellungen");
		
		add(m);
		
		m = new JMenu("Hilfe");
		
		add(m);

		
		
		
	}
	
	
	public void actionPerformed(ActionEvent e) {

		if (e.getActionCommand().equals("Beenden")) {
			System.exit(0);
		}

		if (e.getActionCommand().equals("neuePerson")) {
			new DialogNeuePerson(hauptframe);
		}

		if (e.getActionCommand().equals("Personen anzeigen")) {
			hauptframe.hauptPanel.removeAll();
			hauptframe.hauptPanel.setLayout(new BorderLayout(5,5));
			hauptframe.hauptPanel.add(new PersonenListePanel());
			hauptframe.hauptPanel.validate();
		}
				
		if (e.getActionCommand().equals("Einstellungen")) {
			
		}

	}
	
	
	
	
	
	

}


Dann die Klasse mit JScrollPane und JTable:
Code:
public class PersonenListePanel extends JPanel {
	
	PersonenTable personenTable;
	PersonenTableModel personenTableModel;
	JScrollPane scrollPane;
	
	DBHandler dbHandler;
	
	PersonButton newPerson, editPerson, deletePerson, savePerson;
	ButtonPanel buttonPanel;
	
	
	public PersonenListePanel() {
		
		setLayout(new BorderLayout(5,5));
		setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
		
		dbHandler = new DBHandler();
		dbHandler.personenAnzeigen();
		
		JLabel test = new JLabel("Übersicht Personen");
		test.setFont(new Font("Verdana", Font.BOLD, 20));
		
		personenTableModel = new PersonenTableModel();
		
		personenTable = new PersonenTable(personenTableModel);
		
		
		scrollPane = new JScrollPane(personenTable);
		
		buttonPanel = new ButtonPanel();

	    add(test, BorderLayout.NORTH);
	    add(scrollPane, BorderLayout.CENTER);
	    add(buttonPanel, BorderLayout.EAST);
		
		
	}
	
	
	class ButtonPanel extends JPanel {

		ButtonPanel() {
			
			newPerson = new PersonButton("neue Person");
			editPerson = new PersonButton("ändern");
			deletePerson = new PersonButton("löschen");
			savePerson = new PersonButton("speichern");
						
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			
			add(Box.createRigidArea(new Dimension(0, 10)));
			add(newPerson);
			add(Box.createRigidArea(new Dimension(0, 10)));
			add(editPerson);
			add(Box.createRigidArea(new Dimension(0, 10)));
			add(deletePerson);
			add(Box.createRigidArea(new Dimension(0, 10)));
			add(savePerson);
			add(Box.createRigidArea(new Dimension(0, 10)));
			
		}
	
	}
	
	
	class PersonButton extends JButton {
		
		PersonButton(String text) {
			
			this.setText(text);
			
			setPreferredSize(new Dimension(120,20));
			setMinimumSize(this.getPreferredSize());
			setMaximumSize(this.getPreferredSize());
			
			
		}
		
		
	}
	
	

}

Die HauptFrame-Klasse...
Code:
public class HauptFrame extends JFrame {
	
	private int width, height;
	private int x, y;
	private Dimension d;
	private HauptMenue hauptmenue;
	JPanel hauptPanel;
		
	public HauptFrame() {

		// Grösse des Bildschirms abfragen
		d = Toolkit.getDefaultToolkit().getScreenSize();

		// Framegrösse 9/10 vom kompletten Bildschirm
		width = d.width * 9 / 10;
		height = d.height * 9 / 10;

		// Frame auf Bildschirm zentriert
		x = (d.width / 2) - (width / 2);
		y = (d.height / 2) - (height / 2);

		setBounds(x, y, width, height);
		
		hauptPanel = new JPanel();
		
		add(BorderLayout.CENTER, hauptPanel);
		
		hauptmenue = new HauptMenue(this);
		setJMenuBar(hauptmenue);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
			
	}

}
 
A

anderer Gast

Gast
Sorry, hat sich wohl erledigt, nachdem ich den Code nochmal durchgeschaut habe. Hatte natürlich vergessen, dem hauptPanel im HauptFrame das BorderLayout zuzuweisen. Ist dann ja klar, wenn das JPanel das FlowLayout als Standard hat, dass die Anordnung dann komisch aussieht... Trotzdem nochmal vielen Dank für deine Hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Panel austauschen, ohne Größenänderung des Frames AWT, Swing, JavaFX & SWT 5
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
M JavaFX Slide Panel AWT, Swing, JavaFX & SWT 2
P Swing Panel nicht sichtbar AWT, Swing, JavaFX & SWT 1
M Swing JtextField Panel in ander Panel aufrufen AWT, Swing, JavaFX & SWT 0
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
X Java Panel zeitweise repainten AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
B zweidimensionales Buttonarray auf Panel AWT, Swing, JavaFX & SWT 11
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
E Panel mit Leben füllen AWT, Swing, JavaFX & SWT 2
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Panel in Panel zentriert nicht richtig AWT, Swing, JavaFX & SWT 3
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
O LayoutManager Panel in Panel "maximieren" AWT, Swing, JavaFX & SWT 2
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
B Export eines Panel mit ScrollBar AWT, Swing, JavaFX & SWT 4
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
bluerob Panel im BorderLayout South wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
M Swing Panel klassenübergreifend ändern AWT, Swing, JavaFX & SWT 6
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
H Scroll Panel wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 6
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
X Swing Panel Extra Klasse & Aufruf über Button AWT, Swing, JavaFX & SWT 18
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
S Vaadin: Panel AWT, Swing, JavaFX & SWT 10
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
C Etwas durchsichtig machen über einem Panel AWT, Swing, JavaFX & SWT 7
K Panel zu Laufzeit ändern AWT, Swing, JavaFX & SWT 6
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
J JPanel mit anderem Panel aus anderer Klasse setzen AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Panel-Zeichnung erscheint nicht AWT, Swing, JavaFX & SWT 7
S Panel rapaint AWT, Swing, JavaFX & SWT 18
T AffineTransform wirkt sich nur auf dem ersten Panel aus AWT, Swing, JavaFX & SWT 3
K Swing: Panel in Panel erzeugen AWT, Swing, JavaFX & SWT 11
M Panel in SWT einfügen AWT, Swing, JavaFX & SWT 12
T auf Panel zeichnen AWT, Swing, JavaFX & SWT 4
A FormLayout Panel-Breite AWT, Swing, JavaFX & SWT 7
Dit_ "Expandable" Panel ? AWT, Swing, JavaFX & SWT 6
A Panel-Unterklasse funktioniert nicht AWT, Swing, JavaFX & SWT 16
A Panel zu klein AWT, Swing, JavaFX & SWT 14
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
S Swing Größe von JLabels verändern sich in einem Panel unterschiedlich AWT, Swing, JavaFX & SWT 6
B Panel als Bild speichern AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen


Oben