Swing JFrame mit JMenuBar, allerdings ohne Erfolg

Jimmy

Mitglied
Hallo,

Und zwar habe ich hier einen Bruchrechner programmiert. Ich weiß, dass das ganze nicht sehr sauber geschehen ist, weil es mir erstmal darum ging alles zum "laufen" zu bekommen. Aufjedenfall funktionieren die Funktionen, sprich man kann Brüche addieren,subtrahieren,dividieren und multiplizieren.

Nun mein Problem. Ich habe das ganze mit JFrame gemacht, lief auch alles ganz gut, bis ich eine Menübar einfügen wollte.

Habe das Prinzip so verstanden :

Ich lege eine Menübar ( JMenuBar ), welche wiederrum Menüs ( JMenu ) besitzt und in den Menüs gibt es halt "Funktionen" also die Items drin ( JMenuItem ). Also wie bei nem Browser oben

Datei Bearbeiten Ansicht Chronik ... sind alle zusammen die JMenuBar, welche allerdings aus den JMenus Datei,Bearbeiten,Ansicht,... besteht

Und in den ganzen Dingen wie Datei gibt es halt die Funktionen.

So habe ich das bei mir auch aufgebaut. Eine Bar mit erstmal einem Menü und zwei Items drinne. Allerdings sehe ich weder eine Bar, noch ein Menü. Vielleicht habe ich etwas vergessen, allerdings bin ich noch neu in Java. Wüsste nur nicht was. Wäre schön wenn mir einer ein Tipp geben könnte, bzw irgendwelche Vorschläge zum lösen.

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 * Beschreiben Sie hier die Klasse Zeichenfeld.
 * 
 * @author (Jim) 
 * @version (1.0)
 */
public class Zeichenfeld extends JFrame implements ActionListener
{
     ....
     private JMenu menu;
     private JMenuItem menu1,menu2;
     private JMenuBar mbar;
     
     /**
     * Konstruktor für Objekte der Klasse Zeichenfeld
     */
    public Zeichenfeld()
    {
        // Instanzvariable initialisieren
        super("Bruchrechner");
        super.setSize(250,300);
        super.setLocation(4,4); // Position des Fensters auf dem Bildschirm
        super.setLayout(null);
        super.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);  // schliesse auch Programm, nicht nur Fenster
        super.setJMenuBar(mbar);
        super.setVisible(true);
        
        //// Menubar ////
        mbar = new JMenuBar();              // JMenuBar anlegen
        mbar.setBounds(0,0,25,300);
        menu = new JMenu("Test");      // In der Bar ist ein Menu zum öffnen
        menu.setBounds(0,0,25,25);
        mbar.add(menu);                         // Menu der Bar zufügen
        menu1 = new JMenuItem("Datei"); // MenuItems ins Menu einfügen
        menu.add(menu1);
        menu2 = new JMenuItem("Test");
        menu.add(menu2);

        //// Buttons ////
........

  }
}

Dann danke schonmal und schönen Abend noch 🙂
 
ich glaube, es liegt daran, dass du zuerst das Menu der MenuBar übergibst und dann erst die
Item an das Menu.

Und da der konstruktor das sequentiell abarbeitet, musst du zuerst die MenuBar erstellt haben, bevor
du diese aufrufst, bzw. dein Fenster gebildet wird.
Du hast schon visible ausgeführt ehe eine Instanz von JMenuBar überhaupt erzeugt wird.


gruß nickname
 
Obs das jetzt ist, weiss ich nicht genau, aber die Klasse Zeichenfeld ist von JFrame abgeleitet, also ist die Klasse Zeichenfeld jetzt auch ein JFrame. Im Konstruktor greifst du mit "super" aber auf die Oberklasse, also JFrame zu. Die ganzen Einstellungen beziehen sich aber auf das Zeichenfeld, also "this".

Ach ja, und was sollen die vielen ".setBounds" ? Die JMenubar, die mittels .setJMenuBar an den JFrame übergeben wird, ist immer grad unterhalb der Titelzeile, da braucht man kein .setBounds, ebensowenig, wie für die JMenuItems.

Hatti
 
Vermutlich liegt's einfach nur daran, dass setVisible(true) - Zeile 29 - zu früh aufgerufen wird.
--> setVisible erst aufrufen, nachdem das Layout steht!!
 
Wenn das Menü geändert wird, nachdem es eingebunden wird (was kein Problem ist), dann musst Du normalerweise ein menu.validate() aufrufen, damit sich das Menü neu aufbaut.

Also entweder die Reihenfolge ändern (erst Menü bauen und dann dem Frame setzen) oder ein validate() aufrufen.
 
Also entweder die Reihenfolge ändern (erst Menü bauen und dann dem Frame setzen) oder ein validate() aufrufen.
Ob das Menu erst aufgebaut wird und dann dem Frame zugeordnet wird oder um gekehrt ist egal - entscheidend ist das setVisible(true).
Nachträgliche (also wenn der Frame bereits sichtbar ist) Änderungen am Layout des Frames können müssen mit einem validate() mitgeteilt werden.
 
Der entscheidende Fehler liegt in der Tatsache, dass du "setJMenuBar" mit einem Wert von "null" aufrufst, und erst danach ein JMenuBar Objekt erstellst.
Java:
        super.setJMenuBar(mbar);
        mbar = new JMenuBar();

Vertausche mal die Zeilen 28 und 32.
 
Der entscheidende Fehler liegt in der Tatsache, dass du "setJMenuBar" mit einem Wert von "null" aufrufst, und erst danach ein JMenuBar Objekt erstellst.
Java:
        super.setJMenuBar(mbar);
        mbar = new JMenuBar();

Vertausche mal die Zeilen 28 und 32.
O.K. Voraussetzung dafür, dass eine MenuBar angezeigt wird ist, dass auch tatsächlich eine eingefügt wird. Hatte ich übersehen😳
 
Soviele Antworten, So Schnell... Garnicht gewohnt 🙂

Vielen lieben Dank an alle. Habe es gerade ausprobiert und siehe da, es funktioniert.

Und auch danke für den Tipp mit dem validate()

Jetzt noch eine letzte Frage, wenn ich in dem Aufgerufenen Menu was stehen habe, was nochmal aufgehen soll. Wie mache ich das?

Also sollte so aussehen:
Datei
Neu ---> Bruch1
---> Bruch2

Also das son MenuItem nochmal aufklappt.
 
Gut, habe es ausprobiert. Funktioniert alles wunderbar. Nurnoch ein paar Funktionen suchen. Aber das geht ja einfach per Actionlistener.

Ein dickes Danke an alle!
Grüße,
 

Zurück
Oben