如何更改JTextField的值?

时间:2013-01-12 06:05:37

标签: java swing jtextfield documentlistener

我正在尝试使用带有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);
}

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

我对此很陌生,如果你善意指导,我感激不尽。

2 个答案:

答案 0 :(得分:7)

我认为你正在寻找

  • JTextField的{​​{3}}方法。
  • setText()一个Writing知道文本何时更改并向其应用总和
  • DocumentListener一个Writing,以确保您的程序不会因输入与数字不同而崩溃。

另一种方法是使用DocumentFilter并使用侦听器。

一些建议。

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

而不是6次:

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

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

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

答案 1 :(得分:6)

您需要使用附加到每个数字字段的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的一些例子)