我怎样才能让 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");
我有一个包含多个组件的 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");