繁体   English   中英

如何使用 java 中的循环从多个 JTextFields 计算求和值

[英]How to calculate summation values from multiple JTextFields using loop in java

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

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

代码:

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

}

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

建议:

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

还,

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

例如,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM