【发布时间】:2015-04-12 21:57:26
【问题描述】:
我基本上创建的是一个 JDialog,它在表单上有一个关键事件。因此,例如,当按下空间时,它会做一些事情。这一直很好,直到我在同一个对话框上创建了一个可编辑的 JTextArea。当我这样做时,我无法从 JTextArea 中移除焦点并使热键起作用。如何让按键事件和 JTextArea 在同一个 JDialog 上运行?
【问题讨论】:
标签: java jtextarea keyboard-events jdialog
我基本上创建的是一个 JDialog,它在表单上有一个关键事件。因此,例如,当按下空间时,它会做一些事情。这一直很好,直到我在同一个对话框上创建了一个可编辑的 JTextArea。当我这样做时,我无法从 JTextArea 中移除焦点并使热键起作用。如何让按键事件和 JTextArea 在同一个 JDialog 上运行?
【问题讨论】:
标签: java jtextarea keyboard-events jdialog
假设您已经为您的 JDialog 对象定义了 KeyListener。
这是获取组件的方法:
dialog.getContentPane().getComponents();
这是获取KeyListeners 的dialog 数组的方法:
KeyListener[] keyListeners = dialog.getKeyListeners();
现在,让我们迭代 Components 并添加 KeyListeners:
Component[] components = dialog.getContentPane().getComponents();
KeyListener[] keyListeners = dialog.getKeyListeners();
for (int componentIndex = 0; componentIndex < components.length; componentIndex++) {
for (int keyListenerIndex = 0; keyListenerIndex < keyListeners.length; keyListenerIndex++) {
components[componentindex].addKeyListener(keyListeners[keyListenerIndex]);
}
}
代码未经测试,如果有任何拼写错误,请告诉我。另外,这不是传递的,也就是说,它不会深入到Components 的Components 的侦听器中,它单独定义了子Components 的关键事件。
【讨论】:
您需要做的是将KeyListener 从JDialog 添加到JTextArea。
下面是这个的SSCCE。
import java.awt.event.*;
import javax.swing.*;
public class DialogListener {
public static void main(String[] args) {
JDialog dialog = new JDialog();
dialog.setSize(300, 400);
dialog.setVisible(true);
KeyListener listener = getKeyListener();
dialog.addKeyListener(listener);
JTextArea area = new JTextArea();
area.addKeyListener(listener);
dialog.add(area);
}
public static KeyListener getKeyListener(){
return new KeyAdapter() {
public void keyTyped(KeyEvent e) {
System.out.println(e.getKeyChar());
}
};
}
}
【讨论】: