从一个JTextField解析多个双精度数

时间:2014-10-06 06:34:47

标签: java swing user-interface calculator

我很确定我已经查看了与此问题相关的大多数问题,但它们都使用多个文本字段,每个按钮一个监听器或类似的东西。我试图从一个文本字段获取多个双输入,其中第一个变量设置为初始文本,第二个变量设置为第二个文本。因此,如果有人输入1 + 4,则第一个变量设置为1,+清除文本字段,第二个变量设置为4.这是第一次写入,因此可能存在许多不必要的事情。

编辑:可能在这里不清楚,我想要发生的是用户输入(1 + 4),单击按钮1将文本字段设置为1并将第一个变量设置为1,然后单击+按钮清除文本字段,然后单击4按钮将文本字段设置为4并将第二个变量设置为4,然后单击等于按钮,结果基于操作员单击。它不是全部输入一个字符串。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class GUICalculator extends JFrame implements ActionListener {

    private static final int WIDTH = 300;
    private static final int HEIGHT = 300;
    private JTextField displayField;
    private static final String[] NUMBERS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/", "C", "=", "."};
    private static final Set<String> OPERATORS = new HashSet<>(Arrays.asList("+", "-", "*", "/", "C", "="));
    private double n1, n2, result;

    public GUICalculator() {
        super("Calculator");
        setLayout(new BorderLayout());
        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout());
        displayField = new JTextField();
        displayField.setEditable(false);
        add(displayField, BorderLayout.NORTH);
        add(buttonPanel);

        for (String number : NUMBERS) {
            JButton buttons = new JButton(number);
            buttons.addActionListener(this);
            buttonPanel.add(buttons);
        }
    }

    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        for (String number : NUMBERS) {
            if (command.equals(number) && !OPERATORS.contains(command)) {
                displayField.setText(displayField.getText() + command);
                n1 = Double.parseDouble(displayField.getText());
            }

            //n2 = Double.parseDouble(displayField.getText());

            switch (command) {
                case "+":
                    result = n1 + n2;
                    displayField.setText("");
                case "-":
                    result = n1 - n2;
                    displayField.setText("");
                case "*":
                    result = n1 * n2;
                    displayField.setText("");
                case "/":
                    try {
                        if (n2 == 0)
                            throw new DivisionByZeroException();
                        result = n1 / n2;
                    } catch (DivisionByZeroException f) {
                        f.getMessage();
                        displayField.setText("");
                        break;
                    }
                case "=":
                    displayField.setText(Double.toString(result));
                    break;
                case "C":
                    displayField.setText("");
            }
        }
    }

    public static void main(String[] args) {
        GUICalculator gc = new GUICalculator();
        gc.setVisible(true);
    }
}

注释行是我想要的内容,但我不知道该放在哪里。

1 个答案:

答案 0 :(得分:1)

问题是Double.parseDouble尝试解析整个String,而您尝试将String作为一组标记读取。这需要实现表达式解析器。您的代码看起来有点像解析器,但需要一种方法来对String进行标记。

您可以查看this tutorial等解释。

还有一句话:请使用case语句终止break代码块。如果您的代码与+匹配,则会在所有cases中执行操作。因此,撰写1 + 2仍然会产生1 / 2的结果并执行=的操作,因为case确实有break语句。有关详细信息,请参阅Oracle info on the switch statement