JMenuBar in JFrame

Madlip

Bekanntes Mitglied
Hallo Community,

ich hab da ein Problem und zwars ich bau in einer Klasse meine JMenuBar zusammen und will dann in einer anderen Klassen eben dieses Objekt mitgeben, sprich in den JFrame.setJMenuBar() einsetzten. doch es geht einfach nicht 🙁

Anbei lege ich den code mal mit dazu:

Meine Klasse MenueBar(in dieser Klasse baue ich den MenueBar zusammen):

Java:
public class MenueBar implements ActionListener{
	
	//Menüleiste
	JMenuBar menueLeiste;
	
	//Menüleiste Elemente
	JMenu datei = new JMenu("Datei");
	JMenu titel = new JMenu("Titel");
	JMenu collection = new JMenu("Collection");
	JMenu server = new JMenu("Server");
	JMenu tools = new JMenu("Tools");
	JMenu hilfe = new JMenu("Hilfe");
	
	
	//Datei
	JMenuItem oeffnen = new JMenuItem("Datei öffnen");
	JMenuItem neu = new JMenuItem("Neue Datei");
	JMenuItem save = new JMenuItem("Datei speichern");
	JMenuItem saveas = new JMenuItem("Datei speichern");
	JMenuItem close = new JMenuItem("Datei speichern unter");
	
	//titel
	JMenuItem openTitel = new JMenuItem("Titel öffnen");
	JMenuItem neuTitel = new JMenuItem("Neuer Titel");
	JMenuItem delete = new JMenuItem("Löschen");
	
	public MenueBar(){
		
		
			
		
		menueLeiste = new JMenuBar();
		
		//Menüelemente erzeugen 
		
		//Menüelemente hinzufügen
		menueLeiste.add(datei);
		menueLeiste.add(titel);
		menueLeiste.add(collection);
		menueLeiste.add(server);
		menueLeiste.add(tools);
		menueLeiste.add(hilfe);
		
		datei.add(oeffnen);
		datei.add(neu);
		datei.add(save);
		datei.add(saveas);
		datei.add(close);
		
		titel.add(openTitel);
		titel.add(neuTitel);
		titel.add(delete);
	
	}
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}

und dann hab ich meine "MainPage" Klasse:

Java:
public class ControllPageBorderLayout{
	
	public void run(){
		JFrame frame = new JFrame("Hauptmenü");
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.setLayout(new BorderLayout());
		
		JLabel label = new JLabel();
		label.setPreferredSize(new Dimension(250, 50));
		
		JLabel label2 = new JLabel();
		label2.setPreferredSize(new Dimension(550, 50));
		
		Component menueLeiste = new JMenuBar();
		JMenuBar menueLeiste2;
		
		menueLeiste2 = new MenueBar(); //aktueel ist der Fehler hier, wenn ich es änder haben ich den Fehler bei der deklaration und in der setMenuBar
		
		frame.setJMenuBar(menueLeiste2);
		
		frame.add(label2, BorderLayout.SOUTH);
		frame.pack();
		//Window size
		frame.setSize(1200, 700);
		
		frame.setLocationRelativeTo(null);
		//Window setting
		frame.setResizable(true);
		frame.setVisible(true);
	}

}

wäre auch sehr dankbar wenn ihr einen Lösungsansatz hättet.

MfG
Madlip
 
du erweiterst deine MenuBar-Klasse um mindestens eine getter-Methode:

Java:
public JMenuBar getMenueLeiste() {
		return menueLeiste;
	}

und rufst dann in der "MainPage" Klasse:

Java:
    MenueBar menueBar =new MenueBar();
        
        //menueLeiste2 = new MenueBar(); //aktueel ist der Fehler hier, wenn ich es änder haben ich //den Fehler bei der deklaration und in der setMenuBar
        
        frame.setJMenuBar(menueBar.getMenueLeiste());
 
Hey vielen lieben dank, das war es!

Nur noch eine Frage, warum sagst du um "mindestens eine"

Wäre es ratsam da noch mehrere zumachen oder warum diese Formulierung?
 
nicht unbedingt...

aber grundsätzlich sollte man die Variablen einer Klasse [c]private[/c] deklarieren und Zugriffe von außen nur mit getter-Methoden zulassen => deswegen "um mindestens eine"
 
In deinem Fall dürfte es auch ohne getter gehen:
Java:
//        JMenuBar menueLeiste2;
        MenueBar menueLeiste2 = new MenueBar();
        frame.setJMenuBar(menueLeiste2.menueLeiste);
Allerdings wird die Lösung über getter-Methode oft vorgezogen. Dann sollten allerdings die Attribute als "private" deklariert werden:
Java:
    //Menüleiste
    private JMenuBar menueLeiste;

    //Menüleiste Elemente
    private JMenu datei = new JMenu("Datei");
    private JMenu titel = new JMenu("Titel");
...

Für jedes Attribut, auf das du von außen zugreifen willst, musst du dann eine getter-Methode machen.

Gruß,
André
 
achso achso das meinst du 😉

hast recht, nur hatte die getter/setter missachtet, weil ich das ganze Zeug ja darin in der Klasse aufbaue ... nur da hab ich eins zu viel missachtet 😉 ... vielen Dank nochmal :toll:
 

Zurück
Oben