Запрет пробел от вызова кнопки панели инструментов по умолчанию
Вот простой пример, где AbstractAction используется для кнопки панели инструментов.
Когда приложение запускается и нажимается пробел, оно печатает "Действие внутри панели инструментов".
Цель состояла бы в том, чтобы препятствовать тому, чтобы пробел вызвал кнопку.
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class ToolBarSample
{
public static void main(final String args[])
{
AbstractAction action1 = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("Inside Toolbar Action");
}
};
action1.putValue(Action.NAME, "Button 1");
JFrame frame = new JFrame("JToolBar Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JToolBar toolbar = new JToolBar();
toolbar.setRollover(true);
toolbar.add(action1);
toolbar.addSeparator();
toolbar.add(new JButton("button 2"));
Container contentPane = frame.getContentPane();
contentPane.add(toolbar, BorderLayout.NORTH);
JTextArea textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
contentPane.add(pane, BorderLayout.CENTER);
frame.setSize(350, 150);
frame.setVisible(true);
}
}
Было бы хорошо использовать что-то вроде следующего в вызове actionPerformed() "if (e.getKeyCode() == KeyEvent.VK_SPACE)))", но не удалось получить KeyEvent из ActionEvent.
Эта ссылка была найдена Как остановить пробел от запуска эффекта нажатия на кнопку? но в нем упоминаются проблемы с привязками клавиш и их поведением на разных платформах, чего я бы хотел избежать.
Отредактировано, чтобы добавить.... Я попробовал следующее, которое сработало, но это меняет поведение для всех JFrames в приложении, и я просто хочу один конкретный.
InputMap im = (InputMap)UIManager.get("Button.focusInputMap");
im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none");
im.put(KeyStroke.getKeyStroke("released SPACE"), "none");