Как отключить действие F10 по умолчанию в окне (меню show window)?


Действие по умолчаниюF10 заключается в отображении меню окна. Однако я хотел бы отключить эту функцию.

Обновлено: Фон: я хотел бы реализовать специальное поведение в поле JTextField, если пользователь нажимает любую клавишу. К сожалению, поле JTextField не получает событие, когдаF10 нажата, потому что она поймана окном (и меню показано).

Кто-нибудь знает, как отключить эту привязку ключа в окне?

Я пытался ... отключите его в корневой панели, но без успеха:

frame.getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");
Я много искал, но не нашел решения этой проблемы. Может быть, кто-то из вас знает ответ.

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);
  }
});

}

Plase Примечание: существует различное поведение в зависимости от того, установлено ли значение "setDefaultLookAndFeelDecorated" в true или false.

Заранее спасибо:)

2 3

2 ответа:

Я попытался отключить его в корневой панели, но безуспешно:

Проверьте привязки ключей для Привязок всех компонентов Swing.

Вы увидите, что ключ F10 привязан к ключу JMenuBar. Поэтому вы должны уметь использовать:

menuBar.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0), "none");

Правка:

Упустил тот момент, что у вас не было строки меню.

Похоже, вы не можете просто установить привязку на "нет". Похоже, свинг все еще ищет дерево, чтобы найти действие, чтобы выполнять. Вам нужно предоставить фиктивное действие, которое ничего не делает:

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);

Если я правильно вас понял, создайте событие Keypressed для вашего JTextField на netbeans, помещенное в следующий код

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       

   // Add below
       int key = evt.getKeyCode(); 

           if (evt.getSource() == jTextField1)
           {
               if (key == KeyEvent.VK_F10)
               {
                  // your actions here
                   System.out.println("Hello I am f10");

               }

           }
         //   end of if

        }