Java 包含ActionListener和DocumentListener的JTextField
我在一个非常简单的JFrame上有几个jTextField。字段1首先获得焦点。当用户输入一个数字并按enter键时,我希望焦点切换到字段2。为了实现这一点,我在字段1上附加了一个ActionListener。我还有一个附加到字段1的文档侦听器,它只允许将整数输入该字段 文档监听器首先就位,并且按照我的意愿工作。然后我添加了ActionListener,我认为(但我不确定)我的代码是否正确。但是,当我测试代码时,enter键似乎没有任何效果。我怀疑问题是两个监听器之间的冲突,即文档监听器可能在ActionListener做出反应之前“吞下”了enter键 我的代码如下。我说得对吗?我怎样才能纠正这个问题?谢谢Java 包含ActionListener和DocumentListener的JTextField,java,swing,actionlistener,jtextcomponent,documentlistener,Java,Swing,Actionlistener,Jtextcomponent,Documentlistener,我在一个非常简单的JFrame上有几个jTextField。字段1首先获得焦点。当用户输入一个数字并按enter键时,我希望焦点切换到字段2。为了实现这一点,我在字段1上附加了一个ActionListener。我还有一个附加到字段1的文档侦听器,它只允许将整数输入该字段 文档监听器首先就位,并且按照我的意愿工作。然后我添加了ActionListener,我认为(但我不确定)我的代码是否正确。但是,当我测试代码时,enter键似乎没有任何效果。我怀疑问题是两个监听器之间的冲突,即文档监听器可能在A
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();
}
});
没有一个有效的例子,就不可能准确地诊断您的问题 但是,根据您的描述,我建议您放弃
ActionListener
,转而使用
下面的示例演示了如何更改焦点转移键以及DocumentFilter
(但我认为DocumentListener
或FocusListener
都足以执行您的计算方法)
没有一个有效的例子,就不可能准确地诊断您的问题 但是,根据您的描述,我建议您放弃
ActionListener
,转而使用
下面的示例演示了如何更改焦点转移键以及DocumentFilter
(但我认为DocumentListener
或FocusListener
都足以执行您的计算方法)
我认为您的代码的问题在于按ENTER键没有注册为ActionEvent。相反,按下ENTER键可以被检测为KeyEvent。因此,不是按照如下方式实现事件处理程序:
/* 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();
}
您将需要执行以下操作:
txtNum1.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
System.out.println("here");
txtNum2.requestFocusInWindow();
}
}
当然,我的答案部分来自以下来源:
我认为您的代码的问题在于按ENTER键未注册为ActionEvent。相反,按下ENTER键可以被检测为KeyEvent。因此,不是按照如下方式实现事件处理程序:
/* 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();
}
您将需要执行以下操作:
txtNum1.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
System.out.println("here");
txtNum2.requestFocusInWindow();
}
}
当然,我的答案部分来自以下来源:
如果DocumentListener收到有关ENTER事件的通知,您是否可以使用该事件而不是ActionListener?请编辑您的问题,以包括一个显示您的方法的问题。可能。这正是我最初想要做的,但在之前的一篇关于SO的帖子中,我建议添加一个动作监听器。你能建议我如何修改文档监听器来实现这一点吗?我会避免使用动作监听器以这种方式传递焦点,而是依赖焦点子系统。看看哪些讨论了更改组件焦点键和焦点顺序的方法您怀疑DocumentListener,但您是否检查过这种情况?若要检查DocumentListener是否对ActionListener不触发负责,请暂时将其删除,并查看其是否有效。如果DocumentListener收到有关ENTER事件的通知,您不能使用该事件而不是ActionListener吗?请编辑您的问题,以包括一个显示您的方法的问题。可能。这正是我最初想要做的,但在之前的一篇关于SO的帖子中,我建议添加一个动作监听器。你能建议我如何修改文档监听器来实现这一点吗?我会避免使用动作监听器以这种方式传递焦点,而是依赖焦点子系统。看看哪些讨论了更改组件焦点键和焦点顺序的方法您怀疑DocumentListener,但您是否检查过这种情况?要检查DocumentListener是否对ActionListener不触发负责,请暂时删除它,看看它是否有效。-1,这是AWT的旧帖子。作为使用Swing的一般规则,您应该使用键绑定来侦听这样的事件。然而,在这种情况下,程序员已经为这个需求提供了更好的解决方案。作为使用Swing的一般规则,您应该使用键绑定来侦听这样的事件。然而,在这种情况下,程序员已经为这个需求提供了更好的解决方案。