如何在窗口(显示窗口菜单)中禁用F10默认操作?

QSt*_*orm 5 java swing key-bindings

的默认操作F10是显示窗口菜单。但是,我想禁用此功能。

更新: 背景:如果用户按下任何键,我想在JTextField中实现一种特殊的行为。不幸的是,JTextField在F10按下时无法获取事件,因为它被窗口捕获(并且显示了菜单)。

有谁知道如何在窗口中禁用此键绑定?

我试图在根窗格中禁用它,但没有成功:

frame.getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");
Run Code Online (Sandbox Code Playgroud)

我进行了很多搜索,但没有找到解决该问题的方法。也许你们当中的一个知道答案。

UPDATE2 这里是重现此行为的代码示例:

public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {

  @Override
  public void run() {
    JFrame.setDefaultLookAndFeelDecorated(true);

    final JTextField edit = new JTextField();
    edit.setEditable(false);
    edit.addKeyListener(new KeyAdapter() {

      @Override
      public void keyReleased(final KeyEvent ke) {
        edit.setText(KeyEvent.getKeyText(ke.getKeyCode()));
      }
    });

    final JFrame frame = new JFrame("DEMO");
    frame.setSize(320, 240);
    frame.getContentPane().add(edit);
    frame.setVisible(true);
  }
});
Run Code Online (Sandbox Code Playgroud)

}

请注意:根据“ setDefaultLookAndFeelDecorated”设置为true还是false,会有不同的行为。

提前致谢 :)

cam*_*ckr 5

我试图在根窗格中禁用它,但没有成功:

查看Key Bindings以了解所有 Swing 组件的绑定。

您将看到F10密钥绑定到JMenuBar. 所以你应该能够使用:

menuBar.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");
Run Code Online (Sandbox Code Playgroud)

编辑:

错过了您没有菜单栏的重点。

看来您不能只是将绑定设置为“无”。看起来 Swing 仍在搜索树以查找要执行的操作。您需要提供一个什么都不做的虚拟操作:

Action action = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("do nothing");
    }
};

JPanel content = (JPanel)frame.getContentPane();
String key = "F10";
KeyStroke f10 = KeyStroke.getKeyStroke( key );
frame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(f10, key);
frame.getRootPane().getActionMap().put(key, action);
Run Code Online (Sandbox Code Playgroud)