【问题标题】:How to change the value of the JTextField? [closed]如何更改 JTextField 的值? [关闭]
【发布时间】:2012-12-26 18:41:14
【问题描述】:

我正在尝试使用带有 Swing 的 JFrame 构建一个 Java 应用程序,其中有 5 个 JTextField 实例。其中之一是 Sum。

我需要 JTextField 在我在文本字段中键入一些数字后自动更改。

这怎么可能?

我写的在这里。

private void displaytotalActionPerformed(java.awt.event.ActionEvent evt) {
// display total:
Float num1,num2,num3,num4,num5,num6,result;
num1 = display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());
num2 = display2b.getText().equals("") ? 0 : Float.parseFloat(display2b.getText());
num3 = display3b.getText().equals("") ? 0 : Float.parseFloat(display3b.getText());
num4 = display4b.getText().equals("") ? 0 : Float.parseFloat(display4b.getText());
num5 = display5b.getText().equals("") ? 0 : Float.parseFloat(display5b.getText());
num6 = display6b.getText().equals("") ? 0 : Float.parseFloat(display6b.getText());

result = num1+num2+num3+num4+num5+num6;

System.out.println(result);
}

我尝试使用按钮获取总和并将其显示在此文本字段中,它起作用了。但我希望它自动完成。但是上面的代码在文本字段上没有显示任何内容。

我对此很陌生,如果您能提供指导,我将不胜感激。

【问题讨论】:

  • 你试过什么? Stackoverflow 不会为您编写蹩脚的代码。
  • 您的哪一部分有问题 - 检测数据输入、将文本解析为数字、添加数字?为了尽快获得更好的帮助,请发布当前代码的SSCCE(但请注意,它只需要 3 个文本字段 - 2 个用于输入,1 个用于结果)。顺便说一句 - 数字是整数吗?
  • “感谢您的指导” 这写起来很奇怪,因为您忽略了我发布 SSCCE 的建议。表达感激之情的一个好方法是仔细聆听并听从建议。请注意,如果将ActionListener 添加到输入文本字段,并且当这些文本字段之一处于焦点时用户按下Enter,则将激活侦听器。你也可以看看DocumentListener

标签: java swing jtextfield documentlistener


【解决方案1】:

我想你正在寻找

对此的替代方法是使用JFormattedTextField 并使用侦听器。

一些建议。

  • 开发直觉,通常java类的属性由(get|set)Property更改。使用像 Netbeans 这样的 IDE,它会帮助你找到东西。
  • 自动化通常通过使用 Listener 来实现,只需了解何时使用哪个(这也是直觉的一部分)。
  • 当您发现自己编写重复代码时,请考虑使用函数。即

而不是6次:

display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());

考虑将您的字段放在ArrayList 中并编写一个函数来迭代它们,并用上面的一行来设置所有值。

  • 在进行额外的硬编码之前,请关注JavaTutorials,或在此处提问。对你来说会更有效率。因为您将学习如何自学并深入研究文档。

【讨论】:

  • 你是对的,但这不是 OP 正在寻找的 - “我需要 JTextField 在我在文本字段中键入一些数字后自动更改” 将是我要关注的问题的一部分。如果您对如何实现这一点有一些想法,请更新您的答案:D
  • @MadProgrammer 有什么用?您提供了完整的编码答案,而不是指南。
  • 因为您可能有更好的想法或解决方案(而且我真的不想看到您的回答导致任何反对票)
  • 查看 JFormattedTextField 的 +1 好用处!
【解决方案2】:

您需要使用附加到每个数字字段的DocumentListener。这会在字段发生更改时提醒您。

从那里你需要调用某种sum 方法来自动更新计数。

类似...

public class AutoSum {

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

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

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

    public class AutoSumPane extends JPanel {

        private JTextField[] fields;
        private JTextField tally;

        public AutoSumPane() {

            fields = new JTextField[5];

            DocumentListener docHandler = new DocumentListener() {
                @Override
                public void insertUpdate(DocumentEvent e) {
                    autoSum();
                }

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

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

            setLayout(new GridLayout(6, 1));
            for (int index = 0; index < 5; index++) {
                fields[index] = new JTextField(3);
                fields[index].getDocument().addDocumentListener(docHandler);
                fields[index].setHorizontalAlignment(JTextField.RIGHT);
                add(fields[index]);
            }

            tally = new JTextField(3);
            tally.setHorizontalAlignment(JTextField.RIGHT);
            tally.setEditable(false);

            add(tally);

        }

        protected float getValue(JTextField field) {
            float value = 0;
            String text = field.getText();
            if (text != null && text.trim().length() > 0) {
                try {
                    value = Float.parseFloat(text.trim());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return value;
        }

        protected void autoSum() {
            float sum = 0;
            for (JTextField field : fields) {
                sum += getValue(field);
            }
            tally.setText(NumberFormat.getNumberInstance().format(sum));
        }
    }
}

例如。

查看How to Write a DocumentListener 了解更多信息。

当您使用它时,您可能会发现感兴趣的 Implementing a DocumentFilter(以及一些示例中的 this

【讨论】:

  • 非常感谢 MadProgrammer。现在我知道 DocumentListener 是我需要学习的东西。
  • +1 好疯了。另请参阅此example 和此here(最后一个示例显示如何使用文档过滤器即时计算总和并根据 JTextField 设置文本)
  • @david 你就像我一样为你的答案投票;)
  • @MadProgrammer 哈哈哈它有它的好处:)。但更重要的是你已经回答了这个问题,所以发布一个重复的解决方案是没用的(而且不道德),现在 OP 可以看到要走的路和其他一些例子
  • @GagandeepBali 公平点 - 我鼓励 OP 阅读 DocumentFilter 上的文档,Float.parseFloat 包含在异常处理程序中以短路可能的问题 - 但公平点
猜你喜欢
  • 2013-03-18
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2014-01-13
  • 2015-05-10
  • 1970-01-01
相关资源
最近更新 更多