2012-06-12 31 views
1

問題

我一直在擺弄,以使鍵綁定在我編寫的應用程序中正常工作。Java:JPanel不拿起鍵盤綁定

此前,我一直在使用以下的變體; panel.registerKeyboardAction(this, "createNewFood", KeyStroke.getKeyStroke(KeyEvent.VK_I, KeyEvent.CTRL_DOWN_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW);

但是由於我在文檔中看到registerKeyboardAction被標記爲廢棄,我嘗試切換到首選方法,這種方式就像這樣; panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), new NewFoodAction());

不幸的是,這似乎並沒有工作。

我已經試過

我在網上搜索,我已經嘗試了一堆失敗不同的方法;

  • 不是將鍵綁定到面板上,而是嘗試將它附加到getRootPane()的結果中。沒有工作。
  • 我試過所有不同的「條件」; WHEN_IN_FOCUSED_WINDOWWHEN_ANCESTOR_OF_FOCUSED_COMPONENTWHEN_FOCUSED,沒有工作。
  • 我試過設置panel.setFocusable(true);沒有工作。
  • 我嘗試使用panel.requestFocusInWindow()只是爲了看看它是否可以有條件工作;沒有工作。

如果我將鍵綁定連接到另一個組件,例如JTextField,那麼它就像它應該的那樣工作。

可能與相關的一些其他信息(但我並不真正認爲它是這樣)。

  • 我正在使用MigLayout作爲面板。不要以爲這會影響任何東西,但誰知道。
  • 我現在其他的按鍵組合(也就是被綁定到其他組件其他按鍵)

下面是一些示例代碼:

public FoodFrame() { 
    super("MealTrack"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setPreferredSize(new Dimension(1400, 600)); 
    setLocation(300, 100); 
    setVisible(true); 

    panel = new JPanel(new MigLayout("fill", "[grow][]", "[][][][grow][][]")); 
    add(panel); 
    panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), new NewFoodAction()); 

    pack(); 
    filter.requestFocusInWindow(); 
} 

private class NewFoodAction extends AbstractAction { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("called"); 
    } 

} 

}

有誰知道這個問題似乎什麼是?

+2

*「我使用MigLayout的面板不認爲這會影響什麼,但誰知道」 *如果你換出來爲你將'FlowLayout'和問題仍然存在。爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

2

你做錯了。 您需要同時使用ActionMap和InputMap。你應該這樣做:

panel.getInputMap(con).put(KeyStroke.getKeyStroke("control I"), "createNewFood"); 
panel.getActionMap().put("createNewFood", new NewFoodAction()); 
+1

作品!閱讀[鏈接](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)教程,它說:「從技術上講,你不需要在地圖中使用動作名稱,你可以使用任何對象作爲映射中的「關鍵字」,然而,按照慣例,您使用了一個名稱爲動作的字符串「。另外,我怎麼能在其他地方使用這種格式? 'getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(「control F」),new GrabFocus());' – Poyan

+1

原因是有人必須註冊「KeyStroke.getKeyStroke(」cont F)「action 「作爲關鍵。您還可以使用任何對象作爲輸入和動作映射中的鍵,並且不必是字符串,唯一的要求是在兩個映射中使用的鍵必須相同。 –

+0

謝謝,我欣賞它! – Poyan

2

根據Jcomponent documentation,您正在映射鍵輸入,但它們執行的操作並未實際映射到面板。對於代碼... panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control I"), "newfood!");

...你一定也有...

panel.getActionMap().put("newfood!", [Some actionListener that does what you need to do]); 

不能完全確定,這將解決此問題,但希望能解決它。祝你好運!