Вот простой пример, где 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");