我怎样才能让 JTextArea 使用它的关键事件?

How can I get a JTextArea to consume its key events?

我有一个包含多个组件的 GUI window。其中一些是我添加了键盘快捷键的按钮。例如,可以通过在 window 中的任意位置按 "a" 来触发某个按钮。 JTextArea 中的组件之一。现在,当焦点位于文本区域中并且用户在 JTextArea 中键入 "aha" 时,按钮将被触发两次(除了将文本 "aha" 添加到文本区域之外)。我怎样才能关闭它?我希望 JTextArea 使用 "a" 事件,这样它就不会同时触发按钮。

我想要的:如果在 JTextArea 的 window 除了 的任何地方键入 "a",我希望触发我的按钮。但我不希望在 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();
    }
}

JTextArea 侦听 keyTyped 事件。您正在为 keyPressed.

添加绑定

如果您改为为 keyTyped 事件创建绑定,则文本区域将处理该事件:

//button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "key");
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("typed a"), "key");