GUI je nach Menüauswahl ändern

Status
Nicht offen für weitere Antworten.
Hallo,

ich möchte mir eine Gui aus mehreren Teilen zusammenbauen. Die sich je nach Menüauswahl ändern.

So sieht das alles bisher aus.

Code:
package ...;

import ...;

public class MyFrame extends JFrame implements ActionListener {

private String aButton;
private JMenuBar menuBar;

// Eingabemasken basteln
	public MyFrame(String panel)  {
		super("Autopark");
		try {
		
		setSize(300, 500);
		setLocation(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout(5, 5));
		showMenuBar();
		showPanel(panel);}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

		// Menuebar erzeugen
		public void showMenuBar() {
		this.menuBar = new JMenuBar();
		JMenu db = new JMenu("Datenbanken");
		db.setMnemonic('D');
		JMenuItem vehicle = new JMenuItem();
		vehicle.setText("Fahrzeuge");
		vehicle.setMnemonic("F".charAt(0));
		vehicle.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt F"));
		vehicle.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						MyFrame g = new MyFrame("Fahrzeug");}
					}
				);
		db.add(vehicle);
		JMenuItem clients = new JMenuItem();
		clients.setText("Kunden");
		clients.setMnemonic("K".charAt(0));
		clients.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt K"));
		vehicle.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						MyFrame g = new MyFrame("Kunde");}
					}
				);
		db.add(clients);
		JMenuItem test_runs = new JMenuItem();
		test_runs.setText("Probefahrten");
		test_runs.setMnemonic("P".charAt(0));
		test_runs.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt P"));
//		test_runs.addActionListener(this);
		db.add(test_runs);
		JMenuItem seller = new JMenuItem();
		seller.setText("Verkäufer");
		seller.setMnemonic("V".charAt(0));
		seller.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt V"));
//		seller.addActionListener(this);
		db.add(seller);
		db.addSeparator();
		JMenuItem end = new JMenuItem();
		end.setText("Ende");
		end.setMnemonic("E".charAt(0));
		end.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt F4"));
		db.add(end);
		end.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		this.menuBar.add(db);
		}
		
	
	public void showPanel(String jp) {
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	    Container cp = getContentPane();
	    cp.setLayout(new BorderLayout());
	
	    cp.add(this.menuBar, BorderLayout.NORTH);
	    System.out.println("Unten: " + jp);

	   	    if (jp.equals("Kunde")) {
	    	showKundenPanel();
	    }
	    else if (jp.equals("Fahrzeug")) {
	    	showFahrzeugPanel();
	    }
	    else {
    	
	    showKundenPanel();
	    }
	    
		pack();
		} 
	
	
	public void showKundenPanel() {
	    Container cp = getContentPane();
	    cp.add(new FormPanelKunde(), BorderLayout.SOUTH);
	}
	public void showFahrzeugPanel() {
	    Container cp = getContentPane();
	    cp.add(new FormPanelKunde(), BorderLayout.SOUTH);
	}

	public void actionPerformed(ActionEvent e) {

} }

Es ist halt so gedacht, dass je nachdem welche Datenbank im Menü ausgewählt wird, eine andere Maske auf der GUI erscheinen soll. Nur irgendwo scheint noch die eine oder andere Kleinigkeit zu fehlen.
 
M

Michael...

Gast
Hallo,

bist Du Dir sicher, dass Du jedes Mal einen neuen Frame instanzieren willst (Zeile 38 & 49)? Wenn ja musst Du ihn auch sichtbar machen mit show() oder setVisible(true).
 
Versuche gerade ein Konstrukt zu bauen, wo ich dann nicht den ganzen Frame neu instanzieren muss, sondern nur die Panels austausche. Nur irgendwie klappt das mit dem visible(true) bzw. visible(false) noch nicht ganz. Überall wo ich die einsetzen möchte klappt das nicht.

Code:
package...;

import...;

public class MyFrame extends JFrame implements ActionListener {

// Eingabemasken basteln
	public MyFrame()  {
		super("Autopark");
		try {
		
		//setSize(300, 500);
		setLocation(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout(5, 5));

		// Menuebar erzeugen
		JMenuBar menuBar = new JMenuBar();
		JMenu db = new JMenu("Datenbanken");
		db.setMnemonic('D');
		JMenuItem vehicle = new JMenuItem();
		vehicle.setText("Fahrzeuge");
		vehicle.setMnemonic("F".charAt(0));
		vehicle.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt F"));
		vehicle.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {

// HIER: showFahrzeugPanel() auf visible(true) setzen, alle anderen auf false

					}
				});
		db.add(vehicle);
		JMenuItem clients = new JMenuItem();
		clients.setText("Kunden");
		clients.setMnemonic("K".charAt(0));
		clients.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt K"));
		clients.addActionListener(this);
		vehicle.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {

// HIER: showKundePanel() auf visible(true) setzen, alle anderen auf false

					}
				});
		db.add(clients);
		JMenuItem test_runs = new JMenuItem();
		test_runs.setText("Probefahrten");
		test_runs.setMnemonic("P".charAt(0));
		test_runs.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt P"));
//		test_runs.addActionListener(this);
		db.add(test_runs);
		JMenuItem seller = new JMenuItem();
		seller.setText("Verkäufer");
		seller.setMnemonic("V".charAt(0));
		seller.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt V"));
//		seller.addActionListener(this);
		db.add(seller);
		db.addSeparator();
		JMenuItem end = new JMenuItem();
		end.setText("Ende");
		end.setMnemonic("E".charAt(0));
		end.setAccelerator(javax.swing.KeyStroke.getKeyStroke("alt F4"));
		db.add(end);
		end.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		menuBar.add(db);

	    setDefaultCloseOperation(EXIT_ON_CLOSE);
	    //setSize(450, 150);
	    Container cp = getContentPane();
	    cp.setLayout(new BorderLayout());
	
	    cp.add(menuBar, BorderLayout.NORTH);
	    System.out.println(aButton);

	    showKundenPanel();
	    showFahrzeugPanel();

// AM ANFANG: showKundenPanel auf true; showFahrzeugPanel auf false
	    
		pack();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void showKundenPanel() {
	    Container cp = getContentPane();
	    cp.add(new FormPanelKunde(), BorderLayout.SOUTH);
	}
	public void showFahrzeugPanel() {
	    Container cp = getContentPane();
	    cp.add(new FormPanelFahrzeug(), BorderLayout.SOUTH);
	}

	public void actionPerformed(ActionEvent e) {

} }
 

HLX

Top Contributor
Es wird auch bei jedem Event ein neues Panel erzeugt. Binde stattdessen je eine Panel-Instanz an deinen Frame, diese setzt du dann je nach Wunsch auf visible/non-visible.

Darüberhinaus: "Entlaste" deinen Konstruktor!
 
HLX hat gesagt.:
Binde stattdessen je eine Panel-Instanz an deinen Frame, diese setzt du dann je nach Wunsch auf visible/non-visible.

Also ich bin quasi noch new-be in dem bereich. Fange gerade erst sozusagen an, mich wieder reinzufinden in Java. Bräuchte also für den Vorschlag etwas Hilfe
 

HLX

Top Contributor
Du legst jeweils einen Panel-Typ als Instanzvariable im Frame an. Den Initialisierungskram (ab setSize...) lagerst du in eine Initialisierungsmethode aus --> übersichtlicher. In dieser Methode erzeugst du nun je eine Panel-Instanz und weist sie ihrer Instanzvariable zu. Wenn du ein Panel benötigst holst du dir die Instanzvariable und setzt die gewünschten Werte.
 
HLX hat gesagt.:
Du legst jeweils einen Panel-Typ als Instanzvariable im Frame an. Den Initialisierungskram (ab setSize...) lagerst du in eine Initialisierungsmethode aus --> übersichtlicher. In dieser Methode erzeugst du nun je eine Panel-Instanz und weist sie ihrer Instanzvariable zu. Wenn du ein Panel benötigst holst du dir die Instanzvariable und setzt die gewünschten Werte.

???:L Das klingt für mich noch ein bisschen nach Fachchinesisch :### Mal nachschlagen wo ich Infos dazu finde.

Kannst du mir das nicht an einem Beispiel erklären?
 
M

Michael...

Gast
Hier mal ein Bsp. wie sowas funktionieren könnte. Habe allerdings keine Ahnung, ob das so optimal ist, da ich eigentlich lieber - speziell bei solchen Sachen- mit eigenen LayoutManagern arbeite.
Code:
public class MyFrame extends JFrame {
	
	private Container cp;
	private JLabel label1;
	private JLabel label2;
	
	public static void main(String[] args){
		new MyFrame().show();
	}
	public MyFrame()  {
		setTitle("Oberfläche wechsel Dich");  
		setSize(500, 300); 
		setLocation(300, 300); 
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    
	    cp = getContentPane();
	    cp.setLayout(new BorderLayout()); 
	    
	    label1 = new JLabel("Ansicht 1");
	    label1.setHorizontalAlignment(JLabel.CENTER);
	    JButton button1 = new JButton("Wechsel zu 1");
	    button1.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				cp.add(label1, BorderLayout.CENTER);
				cp.remove(label2);
				cp.validate();
				cp.repaint();
			}
	    });
	    label2 = new JLabel("Ansicht 2");
	    label2.setHorizontalAlignment(JLabel.CENTER);
	    JButton button2 = new JButton("Wechsel zu 2");
	    button2.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				cp.add(label2, BorderLayout.CENTER);
				cp.remove(label1);
				cp.validate();
				cp.repaint();
			}
	    });
	    
	    cp.add(button1, BorderLayout.WEST);
	    cp.add(button2, BorderLayout.EAST);
	    cp.add(label1, BorderLayout.CENTER);
   } 
}
 
So weit so gut, aber irgendwie überschreibt er das alte nur. Sprich: das alte ist im Hintergrund noch zu sehen und dadrauf liegt dann das neue.

Als wenn man zwei Glasscheiben die beschriftet sind, übereinanderlegt
 
So weit so gut, aber irgendwie überschreibt er das alte nur. Sprich: das alte ist im Hintergrund noch zu sehen und dadrauf liegt dann das neue.

Als wenn man zwei Glasscheiben die beschriftet sind, übereinanderlegt
 
M

Michael...

Gast
das kann ich bei mir leider nicht nachvollziehen. Deshalb habe ich ja mittels remove() die Komponente vom ContentPane des Frames entfernt. Und was nicht mehr da ist sollte auch nicht mehr angezeigt werden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Swing Unterscheidung neues Frame erstellen oder vorhandenes nach vorne holen AWT, Swing, JavaFX & SWT 11
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
H JavaFX Fenstergröße nach maximieren erkennen AWT, Swing, JavaFX & SWT 6
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
berserkerdq2 Mein Rechteck hat 4 Seiten, ich soll je nach dem, welche Seite berührt wurde, etwas ausführen, wie prüfe ich das? AWT, Swing, JavaFX & SWT 12
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
VPChief Nach abspielen von Sound reagiert das Program nichtmehr AWT, Swing, JavaFX & SWT 9
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
G JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F JavaFX Zustand der CheckMenuItems behalten nach Programmneustart AWT, Swing, JavaFX & SWT 7
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
stroggi Swing Suche nach Kurveneditor (UI-Element) AWT, Swing, JavaFX & SWT 1
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
L JTextField erscheint erst nach Veränderung der Framegröße AWT, Swing, JavaFX & SWT 5
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
A Nach klick auf Button neuen Inhalt im gleichen Fenster AWT, Swing, JavaFX & SWT 3
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
N Swing Abfrage durch JTextField nach Button betätigung AWT, Swing, JavaFX & SWT 3
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
C Benutzername in GUI eingeben und nach Spiel neues Fenster Benutzername wieder anzeigen AWT, Swing, JavaFX & SWT 1
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing Seltsame Ausgabe nach ButtonClick AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
L Graphik nach 100 ms neu laden AWT, Swing, JavaFX & SWT 1
B Doppelte MenuBar -> Nach Minimieren verschwunden AWT, Swing, JavaFX & SWT 3
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
E JMenu erscheint nach RDP-Verbindung auf falschem Desktop AWT, Swing, JavaFX & SWT 1
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
J JTable filtern nach einer Spalte AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
K Swing JPanel nach oben und links vergrößern AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
J Swing: JFrame nach oben "aufklappen" AWT, Swing, JavaFX & SWT 0
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
G .jar startet nicht nach Exportierung AWT, Swing, JavaFX & SWT 7
P Swing JTable flimmert nach Zellsortierung AWT, Swing, JavaFX & SWT 3
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
C JTextPane scrollt mit setText() immer nach oben AWT, Swing, JavaFX & SWT 2
D Swing Bestimmte Berechnung von Spalten durchführen und dann die Zeilen nach bestimmten Kriterien einfärben AWT, Swing, JavaFX & SWT 5
A JPanel wird nach Buttonklick nicht angezeigt AWT, Swing, JavaFX & SWT 2
P Swing JTable keine Markierung nach Button klick AWT, Swing, JavaFX & SWT 0
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben