2010-01-07 50 views
7

我有一個菜單項「rename」,其中F2設置爲加速器。事實上,當菜單顯示時,在「重命名」旁邊有一個小小的「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); 
+1

請告訴我們編碼用於設置加速器! – 2010-01-07 10:02:06

+3

難道你的操作系統/窗口管理器「消耗」了按鍵,所以它實際上永遠不會到達你的Swing應用程序(例如,因爲F2被映射到特殊的東西,而Ctrl-F2沒有)? – netzwerg 2010-01-07 15:47:07

回答

4

這可能發生,因爲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子類,而不是「從頭開始」創建它們。除了給你非常簡單的菜單設置代碼之外,你可以爲主菜單和彈出菜單/工具欄使用相同的動作實例,並同時啓用/禁用它們。

4

我知道這是一個古老的線索,但我與原始海報完全相同的東西掙扎,並找到了解決方案。 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); 

    } 
} 
+1

嗯..不要以爲這種綁定工作時,菜單加速器沒有。 – kleopatra 2012-10-26 10:20:55

+0

加速器是添加到某處的綁定。問題在於組件樹中的某些內容在達到綁定之前捕獲鍵擊。我通過編寫遍歷整個Container樹並從其找到的任何JComponent的輸入映射中移除擊鍵的方法來解決此問題。 – 2013-11-22 22:55:35