JMenuBar, JMenu, JMenuItem wird nicht angezeigt

mmhhh

Mitglied
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?

Java:
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);
		
	}
 
Das Problem muss wo anderst liegen, das funktioniert problemlos:

Java:
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();				
			}
		});
	}
}
 
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.
 
Java:
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
 
Java:
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.
 
Wie mans sauberer macht:
Java:
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());
 
Mein neuer Text:

Java:
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;
	    }

}
 
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)
 
danke, jetzt geht es, aber bei dem
Java:
frame.add(main)
bekomme ich einen error, wenn ichs weglasse zeigt es mit die menü leiste an, soll ich das machen?
 
danke, jetzt geht es, aber bei dem
Java:
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?
 
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.
 
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
 
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.
 

Neue Themen


Zurück
Oben