簡體   English   中英

Java:JPanel沒有拿起鍵盤綁定

[英]Java: JPanel doesn't pick up keyboard bindings

問題

我一直在努力使鍵綁定在我編寫的應用程序中正常工作。

以前,我一直在使用以下變體; 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");
    }

}

}

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

根據Jcomponent文檔 ,您正在映射鍵輸入,但它們執行的操作實際上並未映射到面板。 代碼... 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]);

不完全確定會糾正這個問題,但希望能為您解決問題。 祝好運!

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

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

暫無
暫無

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

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