Java 如何更改JTextField的值?

Java 如何更改JTextField的值?,java,swing,jtextfield,documentlistener,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

我正在尝试使用带有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);
}
我试图得到总和,并显示在这个文本字段使用按钮,它的工作。但我希望它能自动完成。但是上面的代码在textfield上没有显示任何内容


我对这个很陌生,如果您能给我指点,我将不胜感激。

我想您正在寻找

  • 一个
    JTextField
    的方法
  • a了解文本何时更改并对其应用sum
  • a以确保您的程序不会因输入不同的数字而崩溃
另一种方法是使用和侦听器

一些建议

  • 开发直觉,java类的属性通常由
    (get | set)属性更改。使用像Netbeans这样的IDE,它将帮助您查找内容
  • 自动化通常是通过使用听者来实现的,只要学会何时使用听者(这也是直觉的一部分)
  • 当你发现自己编写重复的代码时,考虑使用一个函数。i、 e
而不是6次:

display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText());
考虑将字段放在
ArrayList
中,编写一个函数来迭代这些字段,并用上面的一行设置所有值

  • 遵循之前的硬编码,或在此处询问。对你来说会更有成效。因为你将学会如何为自己学习并深入研究文档

您需要使用附加到每个数字字段的
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));
        }
    }
}
公共类AutoSum{
公共静态void main(字符串[]args){
新AutoSum();
}
公共汽车{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的AutoSumPane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类自动sumpane扩展JPanel{
私有JTextField[]字段;
私人现场理货;
公共自动呼吸器(){
字段=新的JTextField[5];
DocumentListener docHandler=新DocumentListener(){
@凌驾
公共作废插入更新(文档事件e){
autoSum();
}
@凌驾
公共作废移除更新(文档事件e){
autoSum();
}
@凌驾
公共作废更改日期(记录事件e){
autoSum();
}
};
setLayout(新网格布局(6,1));
对于(int-index=0;index<5;index++){
字段[索引]=新的JTextField(3);
字段[index].getDocument().addDocumentListener(DoHandler);
字段[index].setHorizontalAlignment(JTextField.RIGHT);
添加(字段[索引]);
}
理货=新的JTextField(3);
tally.setHorizontalAlignment(JTextField.RIGHT);
tally.setEditable(假);
加(理货);
}
受保护的浮点getValue(JTextField字段){
浮点数=0;
String text=field.getText();
如果(text!=null&&text.trim().length()>0){
试一试{
value=Float.parseFloat(text.trim());
}捕获(例外e){
e、 printStackTrace();
}
}
返回值;
}
受保护的void autoSum(){
浮点数和=0;
for(JTextField字段:字段){
sum+=getValue(字段);
}
tally.setText(NumberFormat.getNumberInstance().format(sum));
}
}
}
比如说

有关更多信息,请参阅


当你做这件事的时候,你可能会感兴趣(对于一些例子来说)

你试过什么?Stackoverflow不会为您编写糟糕的代码。您在检测数据输入、将文本解析为数字、添加数字方面遇到了哪些问题?为了更快地获得更好的帮助,可以发布一个当前代码(但请注意,它只需要3个文本字段——2个用于输入,1个用于结果)。顺便说一句,这些数字是整数吗?“如果你能友好地指导我,我将不胜感激”这是一件奇怪的事情,因为你忽略了我关于发布SSCCE的建议。表达感激的一个好方法是仔细倾听并听从建议。请注意,如果将
ActionListener
添加到输入文本字段,并且当其中一个文本字段处于焦点时,用户按
Enter
,则监听器将被激活。你也可以研究一下。你是对的,但这不是OP想要的——“我需要JTextField在文本字段中键入一些数字后自动更改”将是我关注的问题的一部分。如果您对如何实现这一点有一些想法,请更新您的答案:D@MadPr