簡體   English   中英

隱藏菜單欄時JMenuItem加速器不起作用

[英]JMenuItem accelerator not working when menu bar is hidden

這個問題是一個跟進到這個問題

我有一個JMenuBar其行為類似於Firefox和iTunes中的菜單欄。 也就是說,菜單欄最初是隱藏的,但是當您按Alt ,菜單欄出現。

另一個問題的答案解決了實現該功能的問題,但是又帶來了另一個問題:當JMenuBar不可見時, JMenuItem加速器不起作用。 換句話說,您必須先按Alt然后才能使用CTRL+F (已安裝的加速器)。

但是,這不是事實,因為setAccelerator()方法聲明以下內容:

公共無效setAccelerator(KeyStroke keyStroke)

設置組合鍵,該組合鍵在不導航菜單層次結構的情況下調用菜單項的動作偵聽器。 UI負責安裝正確的操作。 請注意,鍵入鍵盤加速器后,無論當前是否顯示菜單,它都將起作用。

因此,我想知道這是否是另一個Java錯誤?

SSCCE (要顯示菜單,請按Alt ,安裝的加速器為CTRL+F的“ Find”,將彈出一個虛擬JOptionPane進行輸入):

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MenuBarTest extends JFrame {

    public MenuBarTest() {
        JMenu jMenu1 = new JMenu();
        JMenu jMenu2 = new JMenu();
        final JMenuBar jMenuBar1 = new JMenuBar();
        JMenuItem jMenuItem1 = new JMenuItem();
        JMenuItem jMenuItem2 = new JMenuItem();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        jMenu1.setText("File");
        jMenuItem1.setText("jMenuItem1");
        jMenu1.add(jMenuItem1);
        jMenuBar1.add(jMenu1);
        jMenu2.setText("Edit");
        jMenuItem2.setText("Find");
        jMenu2.add(jMenuItem2);
        jMenuBar1.add(jMenu2);
        setJMenuBar(jMenuBar1);

        jMenuBar1.setVisible(false);
        ChangeListener listener = new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();
                jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1);
            }
        };
        MenuSelectionManager.defaultManager().addChangeListener(listener);

        jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setText("Find");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String what = JOptionPane.showInputDialog(MenuBarTest.this, "Search for what?");
                System.out.println(what);
            }
        });

        pack();
        setSize(500,500);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MenuBarTest();
            }
        });
    }
}

仔細閱讀您的重點

請注意,鍵入鍵盤加速器后,無論當前是否顯示菜單,它都將起作用。

這是在談論菜單而不是菜單的父菜單 這意味着該菜單可能當前未顯示。 但是,真正的(可能記錄得不夠充分)的抗辯性是它必須顯示出來 更新了我對您先前問題的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM