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.
 
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) {

} }
 
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
 
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?
 
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
 
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.

Neue Themen


Zurück
Oben