簡體   English   中英

擺動:將功能鍵(F2)設置為加速器

[英]Swing: Setting a function key (F2) as an accelerator

我有一個菜單項“重命名”,F2被設置為加速器。 實際上,當菜單顯示時,“重命名”旁邊有一點“F2”指示。

可悲的是,這不起作用。 此加速器不會觸發響應。 當我將加速器更改為CTRL + F2時 - 它可以工作。

看來我應該使用InpoutMpa / ActionMap。 問題是我希望這在應用程序的任何地方都可以工作,所以我試圖將它與頂級JFrame相關聯。 但是,JFrame沒有getInputMap()方法。

丟失。

[添加]

     ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
     JMenuItem mi = new JMenuItem("Rename");
     mi.setAccelerator(ks);
     mi.addActionListener(action); 

我知道這是一個舊線程,但我與原始海報完全相同,並找到了解決方案。 JFrame本身沒有getInputMap方法,但它的根窗格卻有。 所以你必須使用“getRootPane.getInputMap”。

示例代碼:

public class ApplicationFrame extends JFrame {
    private AbstractAction f2Action = new AbstractAction() {
        private static final long serialVersionUID = 1L;

        public void actionPerformed(ActionEvent e) {
            // Do something useful
        }
    };

    public ApplicationFrame() {

        InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap actionMap = getRootPane().getActionMap(); 

        inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action");
        actionMap.put("f2Action", f2Action);

    }
}

這可能正在發生,因為JTable使用F2來調用StartEditing操作(我在其中一個程序上看到了相同的行為並將其跟蹤到此)。

有幾種解決方案。 最激烈的是刪除這個輸入映射(我相信這段代碼實際上刪除了所有JTable的映射):

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
while (imap != null)
{
    imap.remove(keyToRemove);
    imap = imap.getParent();
}

或者,如果您僅使用該表進行顯示,並且不打算讓用戶對其進行編輯,則可以使其不可聚焦:

table.setFocusable(false);

在一個完全不同的主題上,我強烈建議為菜單項創建一個AbstractAction子類,而不是“從頭開始”創建它們。 除了為您提供非常簡單的菜單設置代碼外,您還可以對主菜單和彈出/工具欄使用相同的操作實例,並同時啟用/禁用它們。

暫無
暫無

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

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