У меня есть GUI окно с несколькими компонентами. Некоторые из них являются кнопками, к которым я добавил сочетания клавиш. Например, определенная кнопка может быть вызвана нажатием «а» в любом месте окна. Один из компонентов в JTextArea. Теперь, когда фокус находится в текстовой области, и пользователь вводит, например, «aha» в JTextArea, кнопка запускается дважды (в дополнение к тексту «aha», добавляемому в текстовую область). Как я могу отключить это? Я хочу, чтобы JTextArea использовало событие "a", чтобы оно также не вызывало кнопку.
Что я хочу: если "a" напечатано в любом месте окна , за исключением в JTextArea я хочу, чтобы моя кнопка сработала. Но я не хочу, чтобы кнопка запускалась, когда JTextArea находится в фокусе, а пользователь печатает в JTextArea.
Что я уже пробовал: я пытался добавить KeyListener в JTextArea, который перехватывает и потребляет любой ключ, который напечатан. Но это имело противоположный эффект: кнопка все еще срабатывает, но буква не добавляется в JTextArea.
Вот минимальный пример:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
// Create a simple GUI window
public class Gui
{
private static void createWindow()
{
// Create a frame.
JFrame frame = new JFrame("Simple");
// Add a
// Add a text area.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea textarea = new JTextArea();
textarea.setPreferredSize(new Dimension(300, 100));
frame.getContentPane().add(textarea, BorderLayout.CENTER);
// Add a button.
JButton button = new JButton();
button.setText("Button");
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.get\
KeyStroke(KeyEvent.VK_A, 0), "key");
Action action = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("Action!");
button.doClick();
}
};
button.getActionMap().put("key", action);
frame.getContentPane().add(button, BorderLayout.LINE_END);
frame.pack();
frame.setVisible(true);
}
public static void main(String args[])
{
System.out.println("Hello, World");
createWindow();
}
}