Menüs in allen Fenstern anzeigen

FEARftw

Mitglied
Guten Tag.

Ich wollte mal eine Frage beantwortet haben. Ich habe ein Menü für meine Anwendung erstellt und auch mit Funktionen versehen.
Ich kann meine Fenster öffnen und schließen und so weiter. Was jetzt mein Problem ist, wie bekomme ich es hin, dass ich das Menu aus dem Hauptframe in allen anderen neuen Fenstern angezeigt bekomme. Jedes Mal den Code in das neue Fenster kopieren kann nicht des Rätsels Lösung sein. Über Hilfe wie ich das Problem lösen kann, wäre ich sehr dankbar.

MfG
 
Da mich doch die probier Wutt gepackt. Ich hab mal ein kleine Beispiel gebaut.

Das ist der Auszug aus einer Klasse.
Java:
       public class GUI extends JFrame
{

	private JPanel contentPane;
	private JButton btnNewButton;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
		{
			public void run()
			{
				try
				{
					GUI frame = new GUI();
					frame.setVisible(true);
				} catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public GUI()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		btnNewButton = new JButton("New button");
		btnNewButton.setBounds(140, 124, 117, 29);
		contentPane.add(btnNewButton);
	}
}

Hier die Klasse wo ich das Menu schnell zusammengebaut habe.
Java:
public class Menu extends JFrame
{
	private JMenuBar menuBar;
	private JMenu mnDatei;
	private JMenuItem mntmBeenden;


	/**
	 * Create the frame.
	 */
	public Menu()
	{
		
		menuBar = new JMenuBar();
		setJMenuBar(menuBar);
		
		mnDatei = new JMenu("Datei");
		menuBar.add(mnDatei);
		
		mntmBeenden = new JMenuItem("Beenden");
		mntmBeenden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setVisible(false);
			    dispose();
			    System.exit(0);
			}
		});
		mnDatei.add(mntmBeenden);
	}

}

Ich habe probiert die Menu Klasse aufzurufen aber leider bringt mir das nicht den Erfolg den ich wollte. Über einen Hinweis wäre ich sehr dankbar.
 
Zuletzt bearbeitet von einem Moderator:
Lass die Klasse Menu nicht von JFrame erben, sondern übergebe in dem Konstruktor des Menus einfach ein JFrame, dann sollte es klappen.
Wie fügst du das Menü hinzu?
 
Ich hab das mal umgesetzt und es klappt sehr gut. Danke für die Hilfe. Das weglasen der Vererbung vom JFrame war die Lösung. Das habe ich ich bei meinen Versuchen nicht berücksichtigt.

Thread kann geschlossen werden
 
Also wenn ich dein Problem richtig verstehe dann möchtest du mehrere JFrames in einer Anwendung anzeigen, die aber alle ein identisches Menu haben sollen ?

Dann wäre doch die einfachste Lösung überhaupt eine Klasse MyFrame zu erstellen, diese von JFrame abzuleiten und im Konstruktor um dein Menu zu erweitern. Und dann erstellt du einfach Instanzen von MyFrame statt von JFrame.

Java:
package multiplejframes;

import javax.swing.SwingUtilities;

public class MultipleJFrames {
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            @Override
            public void run() {
                MyFrame gui1 = new MyFrame (100,100,200,200,"gui1");
                MyFrame gui2 = new MyFrame (200,200,200,200,"gui2");
                MyFrame gui3 = new MyFrame (300,300,200,200,"gui3");
                MyFrame gui4 = new MyFrame (400,400,200,200,"gui4");
                MyFrame gui5 = new MyFrame (500,500,200,200,"gui5");
                gui1.setVisible(true);
                gui2.setVisible(true);
                gui3.setVisible(true);
                gui4.setVisible(true);
                gui5.setVisible(true);
            }
        });
    }
    
}

Java:
package multiplejframes;

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

public class MyFrame extends JFrame{

        private JMenuBar menuBar;
	private JMenu mnDatei;
	private JMenuItem mntmBeenden;
        
    public MyFrame (int xLocation, int yLocation, int width, int height, String title){
        this.setLocation(xLocation, yLocation);
        this.setSize(width, height);
        this.setTitle(title);   
        createMenu();
    }
    
    private void createMenu(){
        menuBar = new JMenuBar();
	setJMenuBar(menuBar);
 
	mnDatei = new JMenu("Datei");
	menuBar.add(mnDatei);
 
	mntmBeenden = new JMenuItem("Beenden");
	mntmBeenden.addActionListener(new MenuListener(this));
	mnDatei.add(mntmBeenden);    
    }
}

Java:
package multiplejframes;

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

public class MenuListener implements ActionListener {

    private MyFrame frame;
    
    public MenuListener(MyFrame frame){
        this.frame = frame;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        frame.setVisible(false);
	frame.dispose();
        System.exit(0); //PROBLEM !!!!!
    }
    
}

Einziges Problem (was aber auch bei der o.g. Lösung auftritt). Wenn du ein Fenster über das Menü beendest sorgt der Aufruf von System.exit(0); dafür das alle übrigen Fenster ebenfalls geschlossen werden. Das ist glaube ich so nicht gewünscht, oder ?

Läßt du System.exit(0); weg so läuft dein Programm im Hintergrund weiter, auch wenn alle Fenster geschlossen wurden.

Lösung wäre eine zusätzliche Klasse in der sich jedes Fenster beim Erstellen an- und beim Schließen wieder abmeldet. Die Klasse prüft dann bei jeder Abmeldung ob dies das letzte Fenster war und würde dann in dem Fall System.exit(0); aufrufen.

Grüße Ernesto95
 
Zuletzt bearbeitet:
Ich nochmal kurz ... Schwachsinn mit der zusätzlichen Klasse zum Registrieren der Fenster :lol:

Einfach eine statische int als Zähler zur Klasse MyFrame hinzufügen mit Startwert 0, im Konstruktor dann hochzählen, im Actionlistener runterzählen und beim runterzählen immer auf den Wert 0 prüfen. Bei Wert 0 dann System.exit(0); aufrufen !

Gute Nacht !
 
Du kannst auch einfach diesen Code Schnipsel schreiben, so geht es bei mir auch:
Java:
panel.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //statt EXIT_ON_CLOSE
frame.dispose(); //In dem Listener, als Aktion
Dieser Lösungsvorschlag ist auch nicht schlecht. Aber so wíe ich das verstanden habe, gibt es schon mehrere JFrames und man will nur noch etwas hinzufügen, da wäre es jetzt nicht schlau noch einmal alles komplett um zu krämpeln.
Was mich an deiner Lösung stören würde, dass alle JFrames in einer Klasse sind. Ich würde wieder eine eigene Klasse für ein JFrame erstellen, da man dadurch einen größeren Durchblick hat, als wenn man alles in eine schmeißt.
 
Das mit dem System.exit(0); lag daran, dass ich nicht an meinen richtigen Code rangekommen bin. Deshlab habe ich einfach schnell ein Beispiel zusammengebaut um den Sachverhalt darzulegen. Mir ist klar das dann das ganze Porgramm geschlossen wird. Mein Programm behandelt das ein bisl anders.

Aber die Variante von dir ist auch nicht schlecht. Danke für die Hilfe.
 

Zurück
Oben