java - 更改文本字段的值,因为另一个文本字段的值已更改,并且相同但相反,导致错误

标签 java swing events

我正在制作一个简单的英里-公里转换器,它会在您键入时自动更新。问题是某个地方抛出了错误。我相信这是因为当我更改其中一个字段时,它会处理事件并更改另一个字段,但由于它还有一个事件处理程序,当它发生更改时,它会尝试更改另一个字段本身,并且它们会不断触发事件直到某个地方发生爆炸。知道如何解决这个问题还是存在完全不同的问题?

这是我的代码:

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;


public class Book extends JFrame{
    private JTextField jtfKilometers = new JTextField(10);
    private JTextField jtfMiles = new JTextField(10);

    public Book(){
        setLayout(new BorderLayout(10, 0));

        JPanel jlblPanel = new JPanel(new GridLayout(2, 0, 50, 5));
        jlblPanel.add(new JLabel("Kilometers"));
        jlblPanel.add(new JLabel("Miles"));
        add(jlblPanel, "West");

        JPanel jtfPanel = new JPanel(new GridLayout(2, 0, 5, 5));
        jtfPanel.add(jtfKilometers);
        jtfPanel.add(jtfMiles);
        add(jtfPanel, "Center");

        jtfKilometers.getDocument().addDocumentListener(new DocumentListener(){

            @Override
            public void insertUpdate(DocumentEvent e) {
                if(jtfKilometers.getText().equals("")){
                    jtfMiles.setText("");
                }else{
                    jtfMiles.setText(Double.parseDouble(jtfKilometers.getText()) * 0.621371 + "");
                }
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                insertUpdate(e);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                insertUpdate(e);
            }
        });

        jtfMiles.getDocument().addDocumentListener(new DocumentListener(){

            @Override
            public void insertUpdate(DocumentEvent e) {
                if(jtfMiles.getText().equals("")){
                    jtfKilometers.setText("");
                }else{
                    jtfKilometers.setText(Double.parseDouble(jtfMiles.getText()) * 1.60934 + "");
                }
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                insertUpdate(e);
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                insertUpdate(e);
            }
        });

    }

    public static void main(String[] args){
        Book f = new Book();
        f.setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

最佳答案

您需要在文本字段的焦点上添加额外的保护,这样您就只能修改另一个文本字段,而不是递归地修改它们。

jtfKilometers.getDocument().addDocumentListener(new DocumentListener() {

@Override
public void insertUpdate(DocumentEvent e) {
    if (jtfKilometers.hasFocus()) { // ADD THIS LINE
        if (jtfKilometers.getText().equals("")) {
            jtfMiles.setText("");
        } else {
            jtfMiles.setText(Double.parseDouble(jtfKilometers.getText()) * 0.621371 + "");
        }
    }
}

类似

jtfMiles.getDocument().addDocumentListener(new DocumentListener() {

    @Override
    public void insertUpdate(DocumentEvent e) {
        if (jtfMiles.hasFocus()) { // ADD THIS LINE
            if (jtfMiles.getText().equals("")) {
                jtfKilometers.setText("");
            } else {
                jtfKilometers.setText(Double.parseDouble(jtfMiles.getText()) * 1.60934 + "");
            }
        }
    }

关于java - 更改文本字段的值,因为另一个文本字段的值已更改,并且相同但相反,导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28547252/

相关文章:

java - Flink 和 Cassandra 连接问题

java.sql.SQLException : ORA-01747: invalid user. table.column、table.column 或列规范

javascript - jqWidgets 中事件触发两次

c# - 如何通过 C# 反射检查一个方法是否可以作为事件的处理程序?

jQuery 文本选择事件

java - Jpa与具有额外列的同一实体的多对多关系

java - RMI 对象未刷新

java - 可以在jtable的某些列中显示pdf作为下载链接吗?

java - 文本文件到 jlabel 以及 jlabel 与文本文件的比较

java - 为什么我在线程 "AWT-EventQueue-0"java.lang.ArrayIndexOutOfBoundsException : 2? 中收到异常