2

JMenuBarFirefox と iTunes のメニュー バーの動作をモデル化しようとしています。動作: メニュー バーは最初は非表示になっています。ただし、 を押すAltと、メニュー バーが表示され (最初の項目が選択された状態で)、メニュー項目が選択されていない場合、メニュー バーは非表示になります。JMenuBar私のアイデアは、 のvia aへの選択の変更をリッスンすることでしChangeListenerSelectionModel

ただし、接続されたSSCCEの動作は望ましくありません。フレームが読み込まれると、JMenuBarは表示されません。を押すAltと、最初のメニューが選択された状態でメニュー バーが表示されます ( のおかげですWindowsLookAndFeel)。ただし、その後Alt押されるたびに no が発生しChangeEventsます。理由がわかりません...

誰かが光を当てていますか?

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;
}
4

2 に答える 2

2

ただし、その後 Alt キーを押しても ChangeEvent は発生しません。理由がわかりません...

  • ChangeListener は、SelectionModel、Mouse、または Key イベントからイベントを発生させます。これらのイベントは想定されています

  • ChangeListener からイベントをシミュレートすることができます。たとえば、メニューの選択をリセットします (代わりに、Focus を JTextField に移動します)。

  • アクセス可能な別のリスナーがあり、独自のイベントを発生させ、正しく

見る

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ButtonModel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

public class MenuBarTest extends javax.swing.JFrame {

    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;
    private JTextField text = new JTextField("text", 10);

    public MenuBarTest() {
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenu1.addMenuListener(new MenuListener() {
            @Override
            public void menuSelected(MenuEvent e) {
                System.out.println("MenuListener - Selected: " + e.toString());
            }

            @Override
            public void menuDeselected(MenuEvent e) {
                System.out.println("MenuListener - Deselected: " + e.toString());
            }

            @Override
            public void menuCanceled(MenuEvent e) {
                System.out.println("MenuListener - Canceled: " + e.toString());
            }
        });
        jMenu1.getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                ButtonModel model = (ButtonModel) e.getSource();
                if (model.isArmed()) {
                    System.out.println("ButtonModel - Armed: " + e.toString());
                } else if (model.isEnabled()) {
                    System.out.println("ButtonModel - Enabled: " + e.toString());
                } else if (model.isPressed()) {
                    System.out.println("ButtonModel - Pressed: " + e.toString());
                } else if (model.isRollover()) {
                    System.out.println("ButtonModel - Rollover: " + e.toString());
                } else if (model.isSelected()) {
                    System.out.println("ButtonModel - Selected: " + e.toString());
                } else {
                    System.out.println("ButtonModel - !!!!!????: " + e.toString());
                }
            }
        });
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenu1.setText("File");
        jMenuItem1.setText("jMenuItem1");
        jMenu1.add(jMenuItem1);
        jMenuBar1.add(jMenu1);
        jMenu2.setText("Edit");
        jMenuItem2.setText("jMenuItem2");
        jMenu2.add(jMenuItem2);
        jMenuBar1.add(jMenu2);
        jMenuBar1.setVisible(false);
        jMenuBar1.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                String strPropertyName = evt.getPropertyName();
                System.out.println("PropertyChangeListener - NewValue: " + evt.getNewValue());
                System.out.println("PropertyChangeListener - OldValue: " + evt.getOldValue());
                System.out.println("PropertyChangeListener - PropagationId: " + evt.getPropagationId());
                System.out.println("PropertyChangeListener - PropertyName: " + evt.getPropertyName());
                if ("MENU.MP_BARBACKGROUND".equals(strPropertyName)) {
                    System.out.println("PropertyChangeListener - MENU.MP_BARBACKGROUND: " + evt.getNewValue());
                }
            }
        });
        jMenuBar1.getSelectionModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("ChangeListener - " + e.toString());
                jMenuBar1.setVisible(jMenuBar1.isSelected());
                System.out.println("ChangeListener - " + jMenuBar1.isSelected());
                System.out.println("ChangeListener - " + jMenuBar1.getSelectionModel().isSelected());
                java.awt.EventQueue.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        text.grabFocus();
                        text.requestFocusInWindow();
                        text.setText(text.getText());
                        text.selectAll();
                    }
                });
            }
        });
        setJMenuBar(jMenuBar1);
        add(text, BorderLayout.NORTH);
        add(new JTextField("text", 10), BorderLayout.SOUTH);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(400, 300));
        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() {
            @Override
            public void run() {
                new MenuBarTest().setVisible(true);
            }
        });
    }
}
于 2013-08-07T06:20:30.633 に答える