Über eine JMenuBar überprüfen ob ein JCheckBoxMenuItem selectiert ist.

Maisl

Mitglied
Der Titel beschreibt die Frage ziemlich gut.
Ich habe mal ein einfache Beispiel um Fehler bei der Menu erstellung zu vermeiden.
How to Use Menus (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Hier mal die Komplette Klasse um das Problem auch zu beschreiben.

Also stellt euch vor ich habe eine Funktion die mir eine MenuBar mit Elementen erstellt, nun dazu ein Untermenü in diesem sich zB ein JCheckboxItem befindet.

Ich übergebe die MenuBar nur einem X-Beliebigen Frame, was ausgezeichnet Funktioniert.
In diesem Frame werden nun diese CheckboxItems selectiert.
Ich übergebe nun diese Bar wieder zurück an meiner Klasse, was auch wunderbar Funktioniert.

Nun möchte ich aber nur diese menuBar auf die CheckboxItems zugreifen ich habe ganz unten ein paar Funktionen womit ich tiefer ins Menü komme, aber ich erreiche nicht die CheckboxItems im Submenü und kann somit auch nicht überprüfen ob sie Selectiert sind oder nicht.

Ich hoffe ich konnte mein Problem deutlich darstellen.

Hintergrund ist die Dynamische Menüerstellung und diese auch wieder auslesen zu können.
Das erstellen ist Recht Simpel aber ich komm anscheind mit der Hierarchy nicht klar, zum auslesen.

Java:
public class Test {

    private JMenuBar menuBar;

    Test() {

    }

    public void createMenuBar() {
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem menuItem;
        JRadioButtonMenuItem rbMenuItem;
        JCheckBoxMenuItem cbMenuItem;

//Create the menu bar.
        menuBar = new JMenuBar();

//Build the first menu.
        menu = new JMenu("A Menu");
        menu.setMnemonic(KeyEvent.VK_A);
        menu.getAccessibleContext().setAccessibleDescription(
                "The only menu in this program that has menu items");
        menuBar.add(menu);

//a group of JMenuItems
        menuItem = new JMenuItem("A text-only menu item",
                KeyEvent.VK_T);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_1, ActionEvent.ALT_MASK));
        menuItem.getAccessibleContext().setAccessibleDescription(
                "This doesn't really do anything");
        menu.add(menuItem);

        menuItem = new JMenuItem("Both text and icon",
                new ImageIcon("images/middle.gif"));
        menuItem.setMnemonic(KeyEvent.VK_B);
        menu.add(menuItem);

        menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
        menuItem.setMnemonic(KeyEvent.VK_D);
        menu.add(menuItem);

//a group of radio button menu items
        menu.addSeparator();
        ButtonGroup group = new ButtonGroup();
        rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
        rbMenuItem.setSelected(true);
        rbMenuItem.setMnemonic(KeyEvent.VK_R);
        group.add(rbMenuItem);
        menu.add(rbMenuItem);

        rbMenuItem = new JRadioButtonMenuItem("Another one");
        rbMenuItem.setMnemonic(KeyEvent.VK_O);
        group.add(rbMenuItem);
        menu.add(rbMenuItem);

//a group of check box menu items
        menu.addSeparator();
        cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
        cbMenuItem.setMnemonic(KeyEvent.VK_C);
        menu.add(cbMenuItem);

        cbMenuItem = new JCheckBoxMenuItem("Another one");
        cbMenuItem.setMnemonic(KeyEvent.VK_H);
        menu.add(cbMenuItem);

//a submenu
        menu.addSeparator();
        submenu = new JMenu("A submenu");
        submenu.setMnemonic(KeyEvent.VK_S);

        menuItem = new JCheckBoxMenuItem("An item in the submenu");
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_2, ActionEvent.ALT_MASK));
        submenu.add(menuItem);

        menuItem = new JCheckBoxMenuItem("Another item");
        submenu.add(menuItem);
        menu.add(submenu);

//Build second menu in the menu bar.
        menu = new JMenu("Another Menu");
        menu.setMnemonic(KeyEvent.VK_N);
        menu.getAccessibleContext().setAccessibleDescription(
                "This menu does nothing");
        menuBar.add(menu);
        
        this.menuBar = menuBar;
    }

    public JMenuBar getMenuBar() {
        return menuBar;
    }

    public boolean isSelected() {
        boolean selected = false;
        String s = "";
        int a = menuBar.getMenuCount();
        JMenu a1 = menuBar.getMenu(0);
        int b = a1.getMenuComponentCount();
        JMenuItem b1 = a1.getItem(10);
        System.out.println("" + a + " "+ b + " " + s);
        return selected;
    }

}
 

dcc

Aktives Mitglied
Ok folgendes:

1. Am besten du machst für jedes Frame / Panel eine Klasse. Dazu einfach "class....extends JMenuBar"
2. Du hast irgendwo dein Hauptframe, eine Klasse mit "...extends JFrame"
2a. Wahrscheinlich hast du noch Klassen für ...extends JPanel
3. Du hast eine Klasse die NUR Daten verwalten kann und getter / setter hat
4. Diese Daten befinden sich in einer Klasse die nur Daten enthält

=> nun brauchst du innerhalb dieser Klassen kein vorangestelltes Objekt mehr. Also einfach add(..), setBackground(...) aufrufen. Ist das gleiche wie this.add(...)

In (2) dem Hauptframe erzeugst einfach ein JPanel Objekt und addest es dem JFrame, anordnen per Layout.
Das Frame kümmert sich dann nicht welches Layout/Design etc. das Jpanel intern hat, man schachtelt praktisch die JPanel Kisten in die JFrame Kiste. So kannst du dir dynamisch die GUI zusammenpuzzeln, indem du einfach ein neues GUI Objekt erzeugst und es dem JFrame hinzufügst. Die Menubar wird mit jframeobjekt.setmenubar festelegt .

Alle GUI Klassen, also JMenuBar und JPanel bekommen über den Konstruktor einen Verweis per Paramenter auf die Datenverwaltungsklasse (3). Dann kannst du über die ActionListener entsprechend reagieren und die Daten verändern. Damit hättest du das Konzept der GUI <> Datenhaltung trennen eingehalten, da GUIs nicht auf Datenbestände direkt zugreifen sollten, sondern nur über Verwaltungsklassen. So lässt sich der Code leicht warten weil Änderungen an der GUI den Daten nix tun und umgekehrt.

Wenn du kein Objekt rumreichen willst, dann kannst du das Observer pattern benutzen.
Bei Änderungen in der GUI löst du dann eine Nachricht aus, die in der Datenverwaltenden Klasse ankommt - du kannst die Änderungen also Mitteilen. Dort können dann auch die Daten verändert werden. Das wäre sogar die beste Lösung.

Hälst du dich strickt an den Kram oben, so kannst du sogar mehrere JFrames öffnen wo alle ihre eigenen Daten haben, verschieden gebaute GUIs usw.
 
Zuletzt bearbeitet:

Maisl

Mitglied
Vielen Dank für den Versuch mir zu Antworten,
das Zeigt mir schon mal das ich mein Problem zu ungenau geschildert habe,
oder dich nicht verstanden habe, in beiden Fällen lass ich mich überraschen.

Ich habe NetBeans verwendet und einfach ein JForm hinzugefügt, ich arbeite ohne Panels sondern mit einem Simplem Null Layout, das ermöglicht mir gute Arbeit mit JLabels als Bilder und überlappenden Elementen, aber eigentlich irrelevant, also das Layout für mein Problem.
Das ist aber eh als evtl in deinem Post.


Joa gut Datenverwalten an sich dafür eine extra Klasse zu machen ist Designtechnisch und so immer Schön, aber ich weiß nicht inwiefern ich dieses Prinzip verletzt habe.
Da ich nur eine Klasse habe die mir die IDE erstellt hat.

Jetzt stell dir einfach vor ich füge einen Button hinzu und wenn ich ihn klicke soll er mir sagen welche CheckBoxen selectiert sind.
Wenn ich sie direkt in der IDE erstelle konnt ich sie immer direkt über den Namen aufrufen.
Ich möchte aber gerne eine extra Klasse haben, an der ich diese MenuBar übergeben kann, die mir dann sagt welche ich aufgerufen habe.

So habe ich versucht bei isSelectet in diesem Beispiel ja auf dieses Unterelement zuzugreifen, wo mein eigentliches Problem ist.

So kann ich halt wie du mir beschreibst einfach auch add in den KLassen direkt aufrufen aber ich mach das über eine Extra Klasse in diesem Beispiel da mir später aus einem Ordner mit Textdatein dieses Menü entsteht, was sehr gut klappt, aber das Kernelement nur komplizierter darstellt.

So habe ich ein extrem billiges Beispiel genommen.
Eine Klasse erstellt ein MenuBar und eine Klasse kann auf alle Elemente in einem MenuBar zugreifen.
Das gelingt mir nur bis zu einger gewissen Ebne. Die 2. wie in diesem Beispiel, wenn ich im Submenu auf die Checkbox zugreifen kann, und das nur über das Element MenuBar fällt mir das schwer.

Also GUIs mit Netbeans nach diesem Prinzip zu erstellen ist ja einfach.
NUr wenn es Dynamisch ist muss ichs halt vorfertigen, das ist kein Ding, es im JFrame zu laden ist auch kein Ding, nur dann per zB Button es zurückzugeben und auf dieses Unterelement zuzugreifen gelingt mir nicht.
 

Maisl

Mitglied
Ich versuch mal eine Kurzform.
Ich suche nach einem Befehl wie
Java:
JCheckBoxMenuItem j = menuBar.getMenu[0].getItem[0].getJCheckBoxMenuItem[0]
Das getJCheckBoxMenuItem[0] ist jetzt schwachsinnig Formuliert aber sollte das Problem verdeutlichen, nachdem ich einmal getItem ausgewählt habe und eigentlich es wieder ein Item ist, kann ich nicht nochmal getItem aufrufen.
Was ich nicht verstehe und kp habe wie ich es umsetze.
 
Zuletzt bearbeitet:

Maisl

Mitglied
Da mir hier keiner helfen konnte, hatte ich das Glück keine Klasse abzuleiten.
Und will mal hier eine Lösung zeigen die eigentlich recht Simple ist.

JCheckBoxMenuItem b = (JCheckBoxMenuItem)jMenuBar1.getMenu(0).getSubElements()[0].getSubElements()[0].getSubElements()[0].getSubElements()[0];
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
R ImageIcon - Über Socket AWT, Swing, JavaFX & SWT 1
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
E Über CellEditorListener an die JTable gelangen AWT, Swing, JavaFX & SWT 4
C AWT Über Pulldownmenü neue Javadatei öffnen AWT, Swing, JavaFX & SWT 7
K Über die Menübar das JPanel ändern AWT, Swing, JavaFX & SWT 2
V Bei JLabel das Icon Über den Text machen AWT, Swing, JavaFX & SWT 2
G Über ein Video zeichnen AWT, Swing, JavaFX & SWT 3
M Über RadioButton öffnen? AWT, Swing, JavaFX & SWT 9
P Über Actionlistener Datenbankzugriff AWT, Swing, JavaFX & SWT 3
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
J Ich kriege eine Fehler Messesage bei meinem Media Player AWT, Swing, JavaFX & SWT 8
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
Lukas2904 Wie speicher ich eine Einstellung? AWT, Swing, JavaFX & SWT 1
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
Monokuma 2D-Grafik Imageimport durch eine gezeichnete Form ersetzen AWT, Swing, JavaFX & SWT 16
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
P Swing Icon einfügen wirft eine Fehlermeldung AWT, Swing, JavaFX & SWT 3
F Variablen an eine Form binden? AWT, Swing, JavaFX & SWT 2
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
W JavaFX Warum kriege ich eine Exception? AWT, Swing, JavaFX & SWT 23
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
Informatiknoob AWT Zahlenraten (eine Zahl zwischen 1 und 10) AWT, Swing, JavaFX & SWT 1
A eine Fehler AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J JavaFX Die Webview stellt eine Webseite nicht dar AWT, Swing, JavaFX & SWT 0
M JavaFX Ein Labeltext eine zeitlang anzeigen dann weiter machen AWT, Swing, JavaFX & SWT 3
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
Thallius Swing JDatePicker oder Sucht jemand eine Aufgabe? AWT, Swing, JavaFX & SWT 0
K Wie kann ich eine Variable zwischen Tab Klassen weitergeben ? AWT, Swing, JavaFX & SWT 7
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
M Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung? AWT, Swing, JavaFX & SWT 2
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
A JFace Wizard: Ist es möglich eine Page zu löschen? AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
M Combo Box auswahl in eine Datenbank speichern AWT, Swing, JavaFX & SWT 1
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
D AWT Das ganze GUI in eine Klasse? AWT, Swing, JavaFX & SWT 1
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
A JavaFX Eine Task mit einer ProgressBar verbinden AWT, Swing, JavaFX & SWT 0
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
G 2D-Slider bzw. eine graphische Auswahlkomponente die sich so verhält AWT, Swing, JavaFX & SWT 6
H Lust auf eine Open-Source Lösung für universelle Java Client-Technologie? AWT, Swing, JavaFX & SWT 11
T Aus JAVA.Jar GUI eine Flash-Datei machen AWT, Swing, JavaFX & SWT 3
S 5 Playlisten eine Skip() AWT, Swing, JavaFX & SWT 4
M SWT Browser nur eine Seite erlauben AWT, Swing, JavaFX & SWT 3
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
I Anhand ButtonGroup eine Auswahl treffen AWT, Swing, JavaFX & SWT 2
B Nach dem Öffnen des Dialogs eine Aktion ausführen. AWT, Swing, JavaFX & SWT 6
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
A Swing Text auf eine Seite an beliebigen Orten schreiben AWT, Swing, JavaFX & SWT 6
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
Rudolf Swing Wie testet man am besten eine GUI? AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
F GroupableTableHeader zeigt nur eine Zeile AWT, Swing, JavaFX & SWT 4
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben