Java 包含ActionListener和DocumentListener的JTextField

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

我在一个非常简单的JFrame上有几个jTextField。字段1首先获得焦点。当用户输入一个数字并按enter键时,我希望焦点切换到字段2。为了实现这一点,我在字段1上附加了一个ActionListener。我还有一个附加到字段1的文档侦听器,它只允许将整数输入该字段

文档监听器首先就位,并且按照我的意愿工作。然后我添加了ActionListener,我认为(但我不确定)我的代码是否正确。但是,当我测试代码时,enter键似乎没有任何效果。我怀疑问题是两个监听器之间的冲突,即文档监听器可能在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();
            }
        });

没有一个有效的例子,就不可能准确地诊断您的问题

但是,根据您的描述,我建议您放弃
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的一般规则,您应该使用键绑定来侦听这样的事件。然而,在这种情况下,程序员已经为这个需求提供了更好的解决方案。