Swing Die Menüleiste erscheint nicht

Status
Nicht offen für weitere Antworten.

gani

Mitglied
Hallo

mein Menü wird nicht angezeigt.

Ich bin das mal mit dem Debugger duchgegangen.

Die Variablen topMenubar und menuFile haben im
Java:
public JMenuBar generateTopMenu() {
...
return topMenubar;
noch Werte
und anschließend beim
Java:
cmd.setView(view);
im MainFrame.java haben sie null!

Kann mir jemand Helfen?



Hier nun den Source-Code:

Java:
package test;

import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JPanel;

public class MainFrame extends JFrame {
	static final long serialVersionUID = 1;
	private JFrame jFrame = null;
	private JPanel jContentPane = null;
	
	public static void main(String[] args) {
        // Benutzerabhängigis Menü; Starte mit Default-Menü
		new MainFrame("TESTMENU",1);
	}
	
	public MainFrame(String title, int user_id) {
		super();
		this.getJFrame().setTitle(title);
		this.getJFrame().setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		this.addJMenuBar(user_id);
	}
	
	public void addJMenuBar(int user_id) {
	    MainMenuSwingController cmd = new MainMenuSwingController();
	    MainMenuSwingView view = new MainMenuSwingView(cmd);
        cmd.setView(view);
        view.setVisible(true);
	}

	private JFrame getJFrame() {
		if (jFrame == null) {
			jFrame = new JFrame();
			jFrame.setSize(new Dimension(800, 600));
			jFrame.setFont(new Font("Dialog", Font.BOLD, 12));
			jFrame.setName("mainframe");
			jFrame.setVisible(true);
			jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
				public void windowClosing(java.awt.event.WindowEvent e) {
					jFrame.setVisible(false);
					jFrame.dispose();
					System.exit(0);
				}
			});
		}
		return jFrame;
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.setSize(800,600);
			jContentPane.setVisible(true);
		}
		return jContentPane;
	}
}

Java:
package test;

public class MainMenuSwingModel {
	//private MainMenuSwingModel	mms_model;
	private MainMenuSwingView	mms_view;
	private MainMenuSwingController	mms_controller;
	
	public MainMenuSwingModel() {
	}

	public void login() {
		System.out.println("MainMenuSwingModel: Aufruf von login()");
	}
}

Java:
package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class MainMenuSwingController implements ActionListener {
	private MainMenuSwingModel				mms_model;
	private MainMenuSwingView				mms_view;
	
    public void setView(final MainMenuSwingView mm) {
        this.mms_view = mm;
    }

    public void actionPerformed(ActionEvent e) {
		System.out.println(e.getActionCommand());
		String cmd = e.getActionCommand(); 
		if (cmd == null) {
			return;
		}
		if (cmd == "login") {
	                mms_model.login();
			return;
		} else if (cmd == "exit") {
                  System.exit(0);
		}
	}
}

Java:
package test;

import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;

public class MainMenuSwingView extends JMenuBar {
	private static final long serialVersionUID = 2L;
	private JMenuBar menubar;
	private JMenuBar topMenubar;
    private JMenu menuFile;
	private JMenuItem mi;
	private MainMenuSwingModel mms_model;
	private MainMenuSwingController mms_cmd;
	private final ActionListener mylistener;

	public MainMenuSwingView(final ActionListener listener) {
		this.mylistener = listener;
		generateTopMenu();
	}
	
	//============================================================== Start-Menue
	public JMenuBar generateTopMenu() {
		//mylistener = (ActionListener) mms_cmd;

		topMenubar = new JMenuBar();
		menuFile = createFileMenu("Datei",'D');
		topMenubar.add(menuFile);
		//topMenubar.setVisible(true);

		return topMenubar;
	}
	
	public JMenu createFileMenu(String label, char mnemonic) {
        // Menü erzeugen
        JMenu menu = new JMenu(label);
        JMenuItem mi;

        // Mnemonic
        String mnemo = null;
        if (mnemonic != ' ') {
       		mnemo = ""+mnemonic;
        }
        if (mnemo != null) 
        	menu.setMnemonic(mnemo.codePointAt(0));
        
        // Menüpunkte öffnen
        mi = addNewMenuItem("Login", "login", 'i', 'i', mylistener);
        menu.add(mi);
        menu.add(new JSeparator());
        mi = addNewMenuItem("Beenden", "exit", 'x', 'x', mylistener);
        menu.add(mi);
        
        return menu;
    }
	
	public JMenuItem addNewMenuItem(final String CMenuItemName, 
			final String ACmd, final char cShortcut, final char cAccelerationKey,
			final ActionListener Listener) {
		
        JMenuItem mi = new JMenuItem(CMenuItemName);
        mi.setMnemonic(cShortcut);
        mi.setAccelerator(KeyStroke.getKeyStroke(cAccelerationKey));
        mi.setToolTipText(null);
        mi.setIcon(null);
        mi.setActionCommand(ACmd);
        mi.addActionListener(mylistener);
        return mi;
    }
}
 
Komponenten für sich visible setzten bringt nichts, Controller spielen erstmal auch keine Rolle,
sie müssen schon mit einem sichtbaren JFrame verknüpft sein

jFrame.setJMenuBar(bar);
How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

-------

edit:
> public class MainMenuSwingView extends JMenuBar {
+

> public JMenuBar generateTopMenu() {
> [..]
> topMenubar = new JMenuBar();

das darf so nicht sein, wenn du von JMenuBar erbst, dann ist MainMenuSwingView die MenuBar,
dann nicht noch ein weiteres MenuBar-Objekt erzeugen
 
Zuletzt bearbeitet von einem Moderator:
Den Source-Code habe ich jetzt wie folgt geändert
Java:
public class MainMenuSwingView extends JMenuBar {
...
	public MainMenuSwingView(final ActionListener listener) {
		this.mylistener = listener;
		generateTopMenu();
	}
	private void generateTopMenu() {
		menuFile = createFileMenu("Datei",'D');
		add(menuFile);
	}
...

Java:
...
public class MainFrame extends JFrame {
...	
	public MainFrame(String title, int user_id) {
...
		this.getJFrame().setJMenuBar(addJMenuBar(user_id));   //  Fehlermeldung
		//this.setJMenuBar(addJMenuBar(user_id));

		//this.addJMenuBar(user_id);
	}

Wenn MainMenuSwingView die MenuBar ist, warum beschwert er sich in der Zeile:
this.getJFrame().setJMenuBar(addJMenuBar(user_id)); ?
 
weil addJMenuBar den Rückgabewert void hat, nicht die MenuBar zurückgibt

-----

this.getJFrame() ist übrigens wieder genausoschlimm,
this ist das JFrame, alles sollte in this rein, nicht in ein separates JFrame
oder MainFrame nicht von JFrame erben lassen, auch denkbar
 
Zuletzt bearbeitet von einem Moderator:
Eine Frage gestellt und schon habe ich etwas mehr über "extends" erfahren. DANKE.

Jetzt erbt mein MainFrame nicht mehr von JFrame und addJMenuBar(int user_id) gibt die MenuBar zurück,
jedoch erscheint immer noch nicht die Menüleiste.

Java:
public class MainFrame {
	...
	private JFrame jFrame = null;
	private JMenuBar jMenuBar = null;
	
	public static void main(String[] args) {
        // Benutzerabhängigis Menü; Starte mit Default-Menü
		new MainFrame("TESTMENU",1);
	}
	
	public MainFrame(String title, int user_id) {
		super();
		getJFrame().setTitle(title);
		getJFrame().setVisible(true);
		getJFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getJFrame().setJMenuBar(addJMenuBar(user_id));
	}
	
	public JMenuBar addJMenuBar(int user_id) {
	    MainMenuSwingController cmd = new MainMenuSwingController();
	    MainMenuSwingView view = new MainMenuSwingView(cmd);
        cmd.setView(view);
        view.setVisible(true);
        
        return view;
	}
 
ich vermute:
getJFrame().setVisible(true);
immer als letztes nach Setzen aller Komponenten aufrufen

endgültig läßt sich das nur mit vollständigem Code sagen,
möglichst kurz, nur eine Klasse, bitte auf Controller verzichten, statt MainMenuSwingView tut es testweise auch ein einfaches new JMenuBar mit vielleicht einem kleinen Test-Menü-Eintrag
 
Also ein UI-Model anstatt ein MVC Model?

Ich habe das MVC Model gewählt weil
je nach Userlevel verschiedene Menüs aufgerufen werden sollen.

Ist das UI-Model auch beim großen Menü übersichtlich?
 
worum gehts denn jetzt auf einmal?
die letzten Tipps waren doch nur die Position eines kleinen Befehls,


und zum Thema Model habe ich gesagt, dass du das bitte nicht posten sollst, falls du ein Testprogramm postest,
denn das Model hat mit dem Anzeigeproblem wahrscheinlich nix zu tun,
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben