【问题标题】:Swing JTextField on text change在文本更改时摆动 JTextField
【发布时间】:2015-09-29 20:36:26
【问题描述】:

我正在制作一个 Swing 表单。当用户更改 TextField 中的文本时,我想从其他字段获取输入,进行一些计算,然后显示结果。我该怎么做?

这是我目前所拥有的:

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);
          }
       }
    });

【问题讨论】:

  • 请让语气不那么令人讨厌...这会阻止人们回答它。编辑问题并准确说明您遇到的问题。
  • 还请提及您遇到的错误并尽可能附上错误日志
  • 使用 DocumentFilter 来控制可以输入到字段中的内容,并使用 DocumentListener 来监视更改。查看Implementing a Document FilterDocumentFilter ExamplesListening for Changes on a Document 了解更多详情
  • 这个问题太模糊了。运行附加的代码时会发生什么?
  • 请解释你在哪里卡住了。不要指望我们通过示例获得完整的代码。只需提及 - 你做了什么,你想要什么以及你得到什么。解决您的问题会很容易。

标签: java swing


【解决方案1】:

如果您想监控一个或多个文本字段的更改,您应该使用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);
        }

    }

}

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

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

请参阅Implementing a DocumentFilterDocumentFilter examples 了解更多详情

【讨论】:

  • 我可以知道您使用什么软件来创建动画 gif 吗?
  • 这是商业机密 ;) licecap,免费且跨平台
  • 我想 +1 以感谢您与我分享软件,当然还有不错的答案;)
  • 文档侦听器可以工作,但是当文本字段中有一个数字并且用户按下退格按钮时,它会为空输入字符串引发错误。现在我被困在那里了?我现在该怎么办?
  • 我假设你的意思是你在一个空的String 上做Integer.parseString?也许首先使用String#isEmpty 测试String 值,然后将值默认为0,当它是......或类似的时候
猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 2012-12-27
  • 2010-11-26
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多