【问题标题】:How to calculate summation values from multiple JTextFields using loop in java如何在java中使用循环计算多个JTextFields的总和值
【发布时间】:2022-07-26 18:31:02
【问题描述】:

我正在尝试制作计算器。 在这里,用户可以添加multipleJTextFields,只需单击一键即可获取他/她想要的输入。

现在我希望用户在multipleJTextFields 中输入他添加的内容,然后单击“结果”按钮将显示所有内容的总和。但我总是得到0 作为输出。

代码:

public class Button extends JFrame {

private JPanel contentPane;
private JButton btnAdd;
private JButton btnResult;
private JTextField resultField;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Button frame = new Button();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public Button() {
    initComponents();
}

static JTextField field = null;
//static JTextField fields[] = new JTextField[10];
private static int y = 0;
ArrayList<String> arr = new ArrayList<String>();

int ans, sum = 0;

private void initComponents() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 527, 414);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    
    btnAdd = new JButton(\"Add\");
    btnAdd.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            field = new JTextField();
            field.setBounds(45, y += 60, 284, 32);
            field.setAlignmentX(Component.CENTER_ALIGNMENT);
            contentPane.add(field);
            contentPane.revalidate();
            contentPane.repaint();
        }
    });
    btnAdd.setBounds(170, 341, 89, 23);
    contentPane.add(btnAdd);
    
    btnResult = new JButton(\"Result\");
    btnResult.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < arr.size(); i++) {
                arr.add(field.getText());
                sum += Integer.parseInt(arr.get(i));
            }
            resultField.setText(String.valueOf(sum));
        }
    });
    btnResult.setBounds(383, 306, 89, 23);
    contentPane.add(btnResult);
    
    resultField = new JTextField();
    resultField.setBounds(361, 275, 129, 20);
    contentPane.add(resultField);
    resultField.setColumns(10);
}

}

请帮助我如何找到正确的输出?

  • 你能分享一下整体代码吗?
  • 您最好的选择是向我们展示可编译和可运行的代码。我们不想看到你的整个程序,而是你应该将你的代码压缩成仍然可以编译的最小部分,没有与你的问题无关的额外代码,但仍然可以演示你的问题,换句话说,minimal reproducible example。请查看链接以了解此有用构造的详细信息。同样,如果代码非常小并且仍然是可编译和可运行的,那么更多的人将能够完全理解代码和问题并帮助提供一个体面的答案。
  • 我已经编辑并完美地提供了代码,以便每个人现在都可以轻松理解。
  • 您的代码无法为我编译,因为有一个方法 initComponents() 被调用但不存在于您发布的代码中。
  • 顺便提一句:永远不能做任何手动尺寸/定位 - 那是独家的LayoutManager 的任务(显然不能设置为 null :)

标签: java swing arraylist


【解决方案1】:

建议:

  • 同样,当您创建数据输入文本字段时,将其添加到 GUI 并将其添加到数据输入字段类型的 ArrayList
  • 然后在结果按钮的 ActionListener 中,使用 for 循环遍历此列表。
  • 在 for 循环内部,获取输入字段,获取其文本(如果使用 JTextField,则通过 .getText()),通过 Integer.parseInt(...) 将其解析为数字,并将其添加到之前初始化为 0 的 sum 变量到for循环。然后在循环后显示结果。

还,

  • 最好使用使用 SpinnerNumberModel(例如 JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1));)的 JSpinner,而不是 JTextField 来输入数字。这将限制用户只能输入数字,并且不允许输入非数字文本,这是您当前设计中固有的危险。
  • 必须通过按钮添加输入字段可能过于复杂
  • 但如果有必要,最好将微调器(或文本字段,如果必须)添加到使用适当布局管理器的 JPanel,例如 new GridLayout(0, 1)(可变行数,1 列),然后添加到 JScrollPane 以便您可以看到与输入的字段一样多的字段。
  • 如果使用 JSpinner,那么您甚至不需要“计算结果”按钮,因为如果您将 ChangeListener 添加到每个 JSpinner,您可以在微调器的数据发生更改时即时计算结果。

例如。,

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class Button2 extends JPanel {
    private List<JSpinner> spinnerList = new ArrayList<>();
    private JButton resultButton = new JButton("Result");
    private JButton addEntryFieldBtn = new JButton("Add Entry Field");
    private JTextField resultField = new JTextField(6);
    private JPanel fieldPanel = new JPanel(new GridLayout(0, 1, 4, 4));

    public Button2() {
        resultField.setFocusable(false);
        resultButton.addActionListener(e -> calcResult());
        resultButton.setMnemonic(KeyEvent.VK_R);
        addEntryFieldBtn.addActionListener(e -> addEntryField());

        JPanel topPanel = new JPanel();
        topPanel.add(addEntryFieldBtn);
        topPanel.add(resultButton);
        topPanel.add(new JLabel("Result:"));
        topPanel.add(resultField);
        
        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.add(fieldPanel, BorderLayout.PAGE_START);
        JScrollPane scrollPane = new JScrollPane(centerPanel);
        scrollPane.setPreferredSize(new Dimension(300, 300));
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
        add(scrollPane);
    }

    private void calcResult() {
        int sum = 0;
        for (JSpinner spinner : spinnerList) {
            sum += (int) spinner.getValue();
        }
        resultField.setText(String.valueOf(sum));
    }

    private void addEntryField() {
        JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1));
        spinner.addChangeListener(evt -> {
            calcResult();
        });
        
        fieldPanel.add(spinner);
        spinnerList.add(spinner);
        revalidate();
        repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Button2 mainPanel = new Button2();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 2017-02-10
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多