JMenuBar SelectionModel ChangeListener wird nur einmal ausgelöst

Ich versuche meine zu bekommenJMenuBar um das Verhalten der Menüleisten von Firefox und iTunes zu modellieren. Das Verhalten: Die Menüleiste ist zunächst ausgeblendet. Aber wenn Sie drückenAlt, wird die Menüleiste angezeigt (wobei das erste Element ausgewählt ist), und wenn Sie kein Menüelement ausgewählt haben, wird die Menüleiste ausgeblendet. Meine Idee war es, auf Änderungen an der Auswahl zu hörenJMenuBar über einChangeListener auf IhrerSelectionModel.

Allerdings ist das Verhalten der angehängtenSSCCE ist nicht wie gewünscht. Wenn der Rahmen geladen wird, wird dieJMenuBar ist nicht sichtbar. Wenn Sie drückenAlterscheint die Menüleiste mit dem ersten ausgewählten Menü (dank derWindowsLookAndFeel). Jedoch jedes weitereAlt Pressfeuer NrChangeEvents. Ich kann nicht herausfinden, warum ...

Hat jemand Licht zu vergießen?

public class MenuBarTest extends javax.swing.JFrame {

    public MenuBarTest() {
        initComponents();
        jMenuBar1.setVisible(false);
        jMenuBar1.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println(e.toString());
                jMenuBar1.setVisible(jMenuBar1.isSelected());
                System.out.println(jMenuBar1.isSelected());
                System.out.println(jMenuBar1.getSelectionModel().isSelected());
            }
        });
    }

    private void initComponents() {

        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jMenu1.setText("File");
        jMenuItem1.setText("jMenuItem1");
        jMenu1.add(jMenuItem1);
        jMenuBar1.add(jMenu1);
        jMenu2.setText("Edit");
        jMenuItem2.setText("jMenuItem2");
        jMenu2.add(jMenuItem2);
        jMenuBar1.add(jMenu2);
        setJMenuBar(jMenuBar1);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 400, Short.MAX_VALUE));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 279, Short.MAX_VALUE));

        pack();
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewClass().setVisible(true);
            }
        });
    }
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage