【问题标题】:Parsing multiple doubles from one JTextField从一个 JTextField 解析多个双打
【发布时间】:2014-10-06 06:34:46
【问题描述】:

我很确定我已经查看了与此问题相关的大多数问题,但它们都使用多个文本字段、每个按钮一个侦听器或类似的东西。我试图从一个文本字段中获取多个双重输入,其中第一个变量设置为初始文本,第二个变量设置为第二个文本。所以如果有人输入 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);
    }
}

注释行是我想进入的,但我不知道放在哪里。

【问题讨论】:

标签: java swing user-interface calculator


【解决方案1】:

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

你可以看看this tutorial等解释。

额外说明:请使用break 语句终止您的case 代码块。如果您的代码要匹配+,它将执行所有casess 中的操作。因此,编写1 + 2 仍会产生1 / 2 的结果并执行= 的操作,因为case 确实有break 语句。如需更多信息,请参阅Oracle info on the switch statement

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2011-04-05
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多