# JMenuBar, JMenu, JMenuItem wird nicht angezeigt



## mmhhh (28. Nov 2012)

Ich habe in meinem programm einen JFrame erstellt, dazu eine JMenuBar geaddet, zu dieser mehrere JMenu's, aber es wird mir nicht angezeit, weis jemand wiso?


```
public JMenuBar menubar;
	
	public Menu()
	{
		menubar = new JMenuBar();
		
		JMenu saveload = new JMenu("Speichern/Laden");
		JMenu module = new JMenu("Module");
		JMenu language = new JMenu("Sprache");
		JMenu controls = new JMenu("Steuerung");
		JMenu tips = new JMenu("Tips");
	
		JMenuItem save = new JMenuItem("Save");
	
		saveload.add(save);
		
		menubar.add(saveload);
		menubar.add(module);
		menubar.add(language);
		menubar.add(controls);
		menubar.add(tips);

		Main.frame.setJMenuBar(menubar);
		
	}
```


----------



## TKausL (28. Nov 2012)

Wäre schön wenn du die Klasse "Main" auch mal posten könntest.


----------



## Volvagia (28. Nov 2012)

Das Problem muss wo anderst liegen, das funktioniert problemlos:


```
package org.javaforum;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Menu {
	private JMenuBar menubar;
	
	public Menu()
	{
	    menubar = new JMenuBar();
	    
	    JMenu saveload = new JMenu("Speichern/Laden");
	    JMenu module = new JMenu("Module");
	    JMenu language = new JMenu("Sprache");
	    JMenu controls = new JMenu("Steuerung");
	    JMenu tips = new JMenu("Tips");

	    JMenuItem save = new JMenuItem("Save");

	    saveload.add(save);
	    
	    menubar.add(saveload);
	    menubar.add(module);
	    menubar.add(language);
	    menubar.add(controls);
	    menubar.add(tips);

	    JFrame frame = new JFrame();
	    frame.setJMenuBar(menubar);
	    
	    frame.setSize(800, 600);
	    frame.setVisible(true);
	    
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Menu();				
			}
		});
	}
}
```


----------



## MrClave (28. Nov 2012)

Dein geposteter Code sieht in Ordnung aus. Daran kann es nicht liegen.

Vielleicht ein einfacher .setVisible() Fehler.

Solltest mal alles posten, was mit dem Frame zusammenhängt.


----------



## mmhhh (28. Nov 2012)

```
package net;
import com.aldebaran.proxy.*;

import java.applet.*;
import javax.swing.*;

import java.awt.*;
import java.util.*;

public class Main extends Applet implements Runnable
{
	private static final long serialVersionUID = 1L;
	
	public static String NAO_IP = "127.0.0.1";
	public static int NAO_PORT = 9559;

	public static boolean isRunning = false;
	public static boolean isMouseLeftDown = false;
	public static boolean isMouseRightDown = false;	
	public static boolean WASD = false;
	public static boolean isMouseControling = false;
	public static boolean isExtraGUiopen = false;
	
	public static JFrame frame = new JFrame();
	public static JPanel panel = new JPanel();
	public static Dimension size = new Dimension(1500,800);
	
	public static Point mse = new Point(0,0);
	
	public static String name = "NAO RC";
	
	private Image screen;
	
	public static Module module; 
	public static Menu menu;
	
	
	public Main()
	{
	
		setPreferredSize(size);
		
		addKeyListener(new Listening());
		addMouseListener(new Listening());
		addMouseMotionListener(new Listening());
		addMouseWheelListener(new Listening());
	}
	
	public static void main(String args[])
	{
		Main main = new Main();
		
						
		frame.add(main);
		frame.pack();
		frame.setName(name);
		frame.setResizable(false);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

		
         module = new Module();
         menu = new Menu();
         
        JMenuBar menubar = new JMenuBar();
 		frame.setJMenuBar(menubar);
 		JMenu saveload = new JMenu("Speichern/Laden");
         
         menubar.add(saveload);
         
       
		
		frame.add(panel);
		main.start();
		ALTextToSpeechProxy tts = new ALTextToSpeechProxy(NAO_IP, NAO_PORT);
	    tts.say("Hello, world");
		
		
	}

	
	public void start()
	{
		requestFocus();
			
		
		isRunning = true;
		new Thread(this).start();
	}
	
	public void stop()
	{
		isRunning = false;
	}
	
	public void tick()
	{		
		
	}
	
	public void render()
	{
	}

	public void run() 
	{
		screen = createVolatileImage(size.width, size.height);
		while(isRunning)
		{
			tick();
			render();
			try
			{
				Thread.sleep(5);
			}
			catch(Exception e) {}
		}
	}
	
	 static
	  {
	  System.loadLibrary("jnaoqi");
	  }

}
```

unwichtiges hab ich gelöscht, wegen der länge


----------



## Volvagia (28. Nov 2012)

```
menu = new Menu();

JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
JMenu saveload = new JMenu("Speichern/Laden");
```

Du überschreibst das Menu des Menüs ja wieder.


----------



## xehpuk (28. Nov 2012)

MrClave hat gesagt.:


> Dein geposteter Code sieht in Ordnung aus.


Da bekommt Ordnung ja eine komplett neue Bedeutung. Ein ganz fieser Nebeneffekt in einem Konstruktoraufruf. Und das auch noch auf eine Klassenvariable, die es so in keinem sauberen Programm geben sollte.


----------



## mmhhh (28. Nov 2012)

Volvagia hat gesagt.:


> Du überschreibst das Menu des Menüs ja wieder.



das hab ich vergessen zu löschen, war nur ein versuch es zum laufen zu bringen


----------



## bERt0r (28. Nov 2012)

Wie mans sauberer macht:

```
public class MyMenuBarFactory
{
    
    public static JMenuBar createMenuBar()
    {
        JMenuBar menubar = new JMenuBar();
        
        JMenu saveload = new JMenu("Speichern/Laden");
        JMenu module = new JMenu("Module");
        JMenu language = new JMenu("Sprache");
        JMenu controls = new JMenu("Steuerung");
        JMenu tips = new JMenu("Tips");
    
        JMenuItem save = new JMenuItem("Save");
    
        saveload.add(save);
        
        menubar.add(saveload);
        menubar.add(module);
        menubar.add(language);
        menubar.add(controls);
        menubar.add(tips);
 
        return menubar;
        }
    }

// Im Frame dann
frame.setJMenuBar(MyMenuBarFactory.createMenuBar());
```


----------



## mmhhh (28. Nov 2012)

Mein neuer Text:


```
package net;

import javax.swing.*;

public class Menu 
{
	public static JMenuBar menubar;
	
	public Menu()
	{
		createMenuBar();
		
	}
	
	 public static JMenuBar createMenuBar()
	    {
	        menubar = new JMenuBar();
	        
	        JMenu saveload = new JMenu("Speichern/Laden");
		menubar.add(saveload);
		
		JMenuItem save = new JMenuItem("Save");
		saveload.add(save);
		
		
		JMenu module = new JMenu("Module");
		menubar.add(module);
		
		JMenuItem connection = new JMenuItem("Connection");
		module.add(connection);
		
		
		JMenu language = new JMenu("Sprache");
		menubar.add(language);
		
		JMenuItem german = new JMenuItem("German");
		language.add(german);
		
		JMenuItem english = new JMenuItem("English");
		language.add(english);
		
		JMenuItem french = new JMenuItem("French");
		language.add(french);
		
		
		JMenu controls = new JMenu("Steuerung");
		menubar.add(controls);
		
		
		JMenu tips = new JMenu("Tips");
		menubar.add(tips);
	        
	        
	        return menubar;
	    }

}
```


----------



## MrClave (28. Nov 2012)

xehpuk hat gesagt.:


> Da bekommt Ordnung ja eine komplett neue Bedeutung. Ein ganz fieser Nebeneffekt in einem Konstruktoraufruf. Und das auch noch auf eine Klassenvariable, die es so in keinem sauberen Programm geben sollte.



Nur schade, dass ich die MenuBar an sich meinte :bahnhof:

Das .setVisible() sollte außerdem nach dem Component-add stehen.
Ich denke mal, dass das hier der Fehler war.

(War zumindest bei meinem Test so)


----------



## mmhhh (28. Nov 2012)

danke, jetzt geht es, aber bei dem 
	
	
	
	





```
frame.add(main)
```
 bekomme ich einen error, wenn ichs weglasse zeigt es mit die menü leiste an, soll ich das machen?


----------



## mmhhh (28. Nov 2012)

danke, jetzt geht es, aber bei dem 
	
	
	
	





```
frame.add(main)
```
 bekomme ich einen error, wenn ichs weglasse zeigt es mit die menü leiste an, soll ich das machen?

und was ist die beste methode einen druck auf ein JMenuItem auszulesen?


----------



## MrClave (28. Nov 2012)

Kannst einen ganz normalen ActionListener, wie bei einem Button, dranhängen.
Ob es noch weitere Möglichkeiten gibt, weiß ich nicht, allerdings finde ich dies schon ziemlich einfach zu implementieren.


----------



## mmhhh (28. Nov 2012)

Und wie kann ich zu einem JMenuItem ein weiteres menü hinzufügen? also so dass da so ein kleines dreieck neben enem Menüpunkt ist, und wenn man draufgeht kommt links ein weiteres menü.

und wie komm ich ein JMenu in der JMenuBar nach ganz rechts schieben, bzw neu plazieren?

danke schonmal für das oben, und hoffentlich für weiteres


----------



## MrClave (28. Nov 2012)

Das dürfte das JPopUpMenu sein.
JPopupMenu

Ich denke mal, dass du es einfach beim adden sortieren solltest.
Also chronologisch adden, je nachdem, wie du es haben willst.

Wie man es im nachhinein macht - Keine Ahnung. Da müsstest du in die API gucken.
Allerdings ist es auf die obige Art am einfachsten.


----------



## Camino (29. Nov 2012)

mmhhh hat gesagt.:


> Und wie kann ich zu einem JMenuItem ein weiteres menü hinzufügen? also so dass da so ein kleines dreieck neben enem Menüpunkt ist, und wenn man draufgeht kommt links ein weiteres menü.



Du kannst Menüs auch verschachteln, also in einem Menüpunkt ein neues Menü mit weiteren Menüpunkten hinzufügen. How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------

