Java 在文本更改时打开JTextField

Java 在文本更改时打开JTextField,java,swing,Java,Swing,我正在做一个摇摆的形式。当用户更改文本字段中的文本时,我希望从其他字段获取输入,进行一些计算,然后显示结果。我该怎么做 以下是我到目前为止的情况: jTextField3.addKeyListener( new KeyAdapter() { public void keyTyped(KeyEvent e){ char c = e.getKeyChar(); if('0'<=c && c<='9')

我正在做一个摇摆的形式。当用户更改文本字段中的文本时,我希望从其他字段获取输入,进行一些计算,然后显示结果。我该怎么做

以下是我到目前为止的情况:

jTextField3.addKeyListener(

    new KeyAdapter() {
        public void keyTyped(KeyEvent e){
           char c = e.getKeyChar();
           if('0'<=c && c<='9') {
                String a = jTextField6.getText().toString();
                String l = jTextField7.getText().toString();
                int m = Integer.parseInt(a);
                int n = Integer.parseInt(l);
                jTextField13.setText("" + m*n);
          }
       }
    });
jTextField3.addKeyListener(
新的KeyAdapter(){
public void keyTyped(KeyEvent e){
char c=e.getKeyChar();

如果('0'如果要监视一个或多个文本字段的更改,则应使用
DocumentListener
,这还将向您提供用户何时将文本粘贴到字段或字段以编程方式更改的通知(通过调用
setText

例如

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Text {

    public static void main(String[] args) {
        new Text();
    }

    public Text() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            JTextField field1 = new JTextField(10);
            JTextField field2 = new JTextField(10);
            JTextField field3 = new JTextField(10);

            DocumentListener dl = new DocumentListener() {

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

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

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

                protected void updateFieldState() {
                    String text = field1.getText() + " " + field2.getText();
                    field3.setText(text);
                }
            };

            field1.getDocument().addDocumentListener(dl);
            field2.getDocument().addDocumentListener(dl);
            field3.setEditable(false);

            add(field1);
            add(field2);
            add(field3);
        }

    }

}

现在,您似乎正在尝试限制可以在字段中键入的字符。您可以使用
JSpinner
JFormattedTextField
,但这些仅提供后期验证

对于实时验证,您应该使用
DocumentFilter
,这将允许您在将输入字段的内容应用于基础
文档之前拦截该字段


有关更多详细信息,请参见和。如果要监视一个或多个文本字段的更改,应使用
DocumentListener
,这还将向您提供用户何时将文本粘贴到字段或字段以编程方式更改的通知(通过调用
setText

例如

import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Text {

    public static void main(String[] args) {
        new Text();
    }

    public Text() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            JTextField field1 = new JTextField(10);
            JTextField field2 = new JTextField(10);
            JTextField field3 = new JTextField(10);

            DocumentListener dl = new DocumentListener() {

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

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

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

                protected void updateFieldState() {
                    String text = field1.getText() + " " + field2.getText();
                    field3.setText(text);
                }
            };

            field1.getDocument().addDocumentListener(dl);
            field2.getDocument().addDocumentListener(dl);
            field3.setEditable(false);

            add(field1);
            add(field2);
            add(field3);
        }

    }

}

现在,您似乎正在尝试限制可以在字段中键入的字符。您可以使用
JSpinner
JFormattedTextField
,但这些仅提供后期验证

对于实时验证,您应该使用
DocumentFilter
,这将允许您在将输入字段的内容应用于基础
文档之前拦截该字段



请参阅和,以了解更多详细信息

请使语气不那么令人讨厌……这会让人们不愿回答。编辑问题,并明确说明您遇到的问题。此外,请提及您遇到的错误,并在可能的情况下附上错误日志使用DocumentFilter控制可以在字段和DocumentListener中输入的内容监控更改。看一看,了解更多详细信息。这个问题太模糊了。当你运行附加的代码时会发生什么?请解释你陷入了什么困境。不要期望我们通过示例获得完整的代码。只需提及-你做了什么,你想要什么,你得到了什么。这将很容易解决你的问题。请他的语气不那么令人讨厌……这让人们不敢回答。编辑问题,明确你遇到了什么问题。同时提及你遇到了什么错误,如果可能的话,附上错误日志使用文档过滤器来控制可以输入到字段中的内容,使用文档监听器来监控更改。查看和查看更详细的是,这个问题太模糊了。当你运行你所附的代码时会发生什么?请解释你陷入了什么困境。不要期望我们通过示例获得完整的代码。只需提及-你做了什么,你想要什么,你得到了什么。这将很容易解决你的问题。我可以知道你使用什么软件来创建动画吗ed gif?这是一个商业秘密;),它是免费的,跨平台的。我想+1感谢您与我分享该软件,当然也感谢您给出了很好的答案;)文档侦听器可以工作,但当文本字段中有一个数字并且用户按下backspace按钮时,它会为空输入字符串抛出一个错误。现在我在那里被卡住了?我现在该怎么办?我假设你的意思是你在对空的
字符串进行
分析字符串
?可能首先使用
字符串测试
字符串
值#我是空的
并且默认值为
0
当它是…或者类似的时候我可能知道你用什么软件来创建动画gif?这是一个商业秘密;),它是免费的,跨平台的。我想+1感谢你和我分享这个软件,当然还有很好的答案;)文档监听器可以工作,但是当有一个数字的时候在textfield中,用户按下backspace按钮,它会为空输入字符串抛出一个错误。现在我在那里被卡住了?我现在该怎么办?我假设你的意思是你在做
Integer。在空
字符串上解析字符串
?可能首先使用
string\isEmpty
测试
字符串
值,并将默认值设置为
0
当它是……或类似的时候