我很确定我已经查看了与此问题相关的大多数问题,但它们都使用多个文本字段,每个按钮一个监听器或类似的东西。我试图从一个文本字段获取多个双输入,其中第一个变量设置为初始文本,第二个变量设置为第二个文本。因此,如果有人输入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);
}
}
注释行是我想要的内容,但我不知道该放在哪里。
答案 0 :(得分:1)
问题是Double.parseDouble
尝试解析整个String,而您尝试将String作为一组标记读取。这需要实现表达式解析器。您的代码看起来有点像解析器,但需要一种方法来对String进行标记。
您可以查看this tutorial等解释。
还有一句话:请使用case
语句终止break
代码块。如果您的代码与+
匹配,则会在所有cases
中执行操作。因此,撰写1 + 2
仍然会产生1 / 2
的结果并执行=
的操作,因为case
确实有break
语句。有关详细信息,请参阅Oracle info on the switch statement。