Java 如何让JTextArea使用其关键事件?

Java 如何让JTextArea使用其关键事件?,java,swing,keyboard,focus,jtextarea,Java,Swing,Keyboard,Focus,Jtextarea,我有一个包含多个组件的GUI窗口。其中一些是我添加了键盘快捷键的按钮。例如,按下窗口中任意位置的“a”可以触发某个按钮。JTextArea中的一个组件。现在,当焦点位于文本区域,并且用户在JTextArea中键入(例如,“aha”)时,按钮会被触发两次(除了文本区域中添加的文本“aha”)。我怎样才能关掉这个?我希望JTextArea使用“a”事件,这样它就不会触发按钮 我想要的是:如果在窗口中除了jtext区域之外的任何地方键入了“a”,我希望我的按钮被触发。但是我不希望在JTextArea处

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

我想要的是:如果在窗口中除了jtext区域之外的任何地方键入了“a”,我希望我的按钮被触发。但是我不希望在JTextArea处于焦点并且用户正在输入JTextArea时触发该按钮

我已经尝试过的:我尝试向JTextArea添加一个KeyListener,它截取并使用键入的任何键。但它产生了相反的效果:按钮仍然会被触发,但字母不会添加到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
事件创建绑定,则文本区域将处理该事件:

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

JTextArea textarea=新的JTextArea();textarea.setPreferredSize(新维度(300100))最好通过指定。这把猜测变成了设计。谢谢,这太棒了!我确认这对“a”键有效。但是我无法为我正在使用的其他一些键(例如“home”键)找到字符串表示形式。例如,“打字回家”似乎不是它。这里的文档:()说我必须在“typed”之后使用一个Unicode字符,但据我所知,没有Unicode字符表示“home”键,也没有其他许多字符,如PgUp。对于键类型化事件是否有类似于VK宏的符号宏?“类型化”是指可以键入到文本组件中的字符。它不适用于其他键。对于其他键绑定,您可以像使用原始代码一样进行操作。太棒了,再次感谢!我注意到,对于箭头键、home键等键,在文本区域中使用它们不会触发按钮,即使使用原始代码也是如此。这一定是因为文本区域将这些键视为按键事件,其余键视为按键类型。令人困惑,但有一定的道理。感谢您提供的有用答案。有关显示每个Swing组件绑定的小应用程序,请参阅。