【发布时间】:2013-02-16 15:49:05
【问题描述】:
我在一个非常简单的 JFrame 上有几个 JTextField。字段 1 首先获得焦点。当用户输入一个数字并按回车键时,我希望焦点切换到字段 2。为此,我将一个 ActionListener 附加到字段 1。我还有一个附加到字段 1 的文档侦听器,它只允许输入整数进入这个领域。
文档侦听器首先就位,它正在按我的意愿工作。然后我添加了 ActionListener,我认为(但我不确定)我的代码对此是否正确。但是,当我测试代码时,回车键似乎根本没有效果。我怀疑问题是两个侦听器之间的冲突,因为文档侦听器可能在 ActionListener 对它做出反应之前“吞下”了 enter 键。
我的代码如下。我对吗?我该如何纠正?谢谢!
txtNum1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
setAnswer(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
setAnswer(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
setAnswer(e);
}
private void setAnswer(DocumentEvent e) {
if (txtNum1.getText().equals("")) {
num1 = 0;
} else {
num1 = Integer.parseInt(txtNum1.getText());
}
calcAnswer(o);
}
});
/* If the user hits the Enter key, we want the focus to shift to
* the next text field */
txtNum1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("here"); //never ouputs
txtNum2.requestFocusInWindow();
}
});
【问题讨论】:
-
如果 DocumentListener 收到有关 ENTER 事件的通知,您不能只使用它而不是 ActionListener 吗?
-
请编辑您的问题以包含一个sscce,以显示您的方法。
-
也许吧。这就是我最初想要做的,但是之前关于 SO 的一篇文章产生了建议添加一个动作监听器的响应。你能建议我如何修改文档监听器来完成这个吗?
-
我会避免使用动作监听器以这种方式传递焦点,而是依赖焦点子系统。看看this example,它讨论了更改组件的焦点键和焦点顺序的方法
-
您怀疑是 DocumentListener,但您检查过是这样吗?要检查 DocumentListener 是否对 ActionListener 未触发负责,请暂时将其删除,然后查看它是否有效。
标签: java swing actionlistener jtextcomponent documentlistener