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
 

FEARftw

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

Java20134

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

FEARftw

Mitglied
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
 

Ernesto95

Aktives Mitglied
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:

Ernesto95

Aktives Mitglied
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 !
 

Java20134

Bekanntes Mitglied
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.
 

FEARftw

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Menüs bauen AWT, Swing, JavaFX & SWT 2
P Menüs und ändlichen überzeichenen JPanel AWT, Swing, JavaFX & SWT 23
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
T Button des Popup-Menüs ermitteln AWT, Swing, JavaFX & SWT 4
G Dynamische Menüs mit Liste von MRU Dateien AWT, Swing, JavaFX & SWT 2
K Transparente Menüs (rechts unten über Uhr) AWT, Swing, JavaFX & SWT 8
I JMenuBar - Menüs sortieren AWT, Swing, JavaFX & SWT 2
L Menüs mit Rundungen und Kanten in einem Strategiespiel AWT, Swing, JavaFX & SWT 3
M LookAndFeel? Erst beim 2.Mal Öffnen eines Menüs? AWT, Swing, JavaFX & SWT 3
M In einem JFrame Menüs & . während der Laufzeit verändern AWT, Swing, JavaFX & SWT 6
B Zwei Choice-Menüs verknüpfen AWT, Swing, JavaFX & SWT 2
A checkbox mit allen tabllen aus datenbank befüllen AWT, Swing, JavaFX & SWT 8
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
S Kein DnD in allen Java Applikationen AWT, Swing, JavaFX & SWT 5
K Simuliere Tastendruck, kommt nicht in allen Programmen an AWT, Swing, JavaFX & SWT 5
F KontextMenü auf allen Textfields im Frame AWT, Swing, JavaFX & SWT 2
M Swing bremst GUIs von allen Programmen aus AWT, Swing, JavaFX & SWT 8
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
F Swing JAVA GUI Übergabe von Werten zwischen mehreren Fenstern/Klassen AWT, Swing, JavaFX & SWT 10
B Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben AWT, Swing, JavaFX & SWT 4
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
JStickman SWT Problem mit Fenstern AWT, Swing, JavaFX & SWT 7
F Initialisieren von Fenstern über Methoden AWT, Swing, JavaFX & SWT 3
U MVC: Rolle vom MainController zu Fenstern, Unterfenster u. Listenern AWT, Swing, JavaFX & SWT 8
I Arbeiten mit mehreren Fenstern AWT, Swing, JavaFX & SWT 4
X Wie passt JIternalFrame sich den anderen Fenstern an? AWT, Swing, JavaFX & SWT 3
Herr.Jth Frage zu inaktiven Fenstern AWT, Swing, JavaFX & SWT 7
M Hintergrundgrafik in Swing-Fenstern AWT, Swing, JavaFX & SWT 11
R Navigieren zwischen mehreren Fenstern AWT, Swing, JavaFX & SWT 7
C Probleme beim ausführen von Programmen mit Fenstern+Inhalt AWT, Swing, JavaFX & SWT 3
U Anwendung mit mehreren "Fenstern" AWT, Swing, JavaFX & SWT 4
H Problem mit Layout Fenstern (Swing) AWT, Swing, JavaFX & SWT 3
L GUI - 2 Buttons mit 2 Fenstern verlinken AWT, Swing, JavaFX & SWT 4
O Applikation mit unterschiedlichen Fenstern AWT, Swing, JavaFX & SWT 4
K JFrames in verschiedenen Fenstern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben