java - 计算器 GUI 问题
问题描述
我在大学一年级编程的第一个学期,我们的任务是制作一个计算器 GUI。我快完成了,但如果分母为 0 但它输出 0.0,我需要使“错误”出现。我的另一个问题是,我需要在显示最终答案后重新启动 gui,但发生的情况是,在我单击等于然后单击它继续的数字之后。因此,如果我按 1+1 然后单击 =,它会输出 2,但是当我单击一个数字(例如 1)时,它就会变成 21。
另外,如何删除每个答案末尾的 .0 ?我在每个方程式之后尝试了 endWith 和 replace ,但它不起作用。
@Override
public void actionPerformed(ActionEvent e){
for(int i=0;i<10;i++) {
if(e.getSource() == numbers[i]) {
text.setText(text.getText().concat(String.valueOf(i)));
}
}
if(e.getSource()==dec) {
if (text.getText().contains(".")) {
return;
} else {
text.setText(text.getText() + ".");
}
}
if(e.getSource()==add) {
num1 = Double.parseDouble(text.getText());
operator ='+';
label.setText(text.getText() + "+");
text.setText("");
}
if(e.getSource()==sub) {
num1 = Double.parseDouble(text.getText());
operator ='-';
label.setText(text.getText() + "-");
text.setText("");
}
if(e.getSource()==mult) {
num1 = Double.parseDouble(text.getText());
operator ='*';
label.setText(text.getText() + "*");
text.setText("");
}
if(e.getSource()==div) {
num1 = Double.parseDouble(text.getText());
operator ='/';
label.setText(text.getText() + "/");
text.setText("");
}
if(e.getSource()==neg) {
Double neg = Double.parseDouble(text.getText());
neg*=-1;
text.setText(String.valueOf(neg));
}
if(e.getSource()==per) {
num1 = Double.parseDouble(text.getText())/100;
label.setText(text.getText() + "%");
text.setText(String.valueOf(num1));
label.setText("");
}
if(e.getSource()==equ) {
num2=Double.parseDouble(text.getText());
switch(operator) {
case'+':
ans=num1+num2;
break;
case'-':
ans=num1-num2;
break;
case'*':
ans=num1*num2;
break;
case'/':
if (num2==0)
text.setText("Error");
else
ans=num1/num2;
break;
}
label.setText("");
text.setText(String.valueOf(ans));
}
}
}
}
解决方案
关于在分母为零时显示“错误”的第一个问题。
当您按下“=”按钮时,您首先进入 switch(operator) 语句的“/”分支。在那里您检查 num2 是否等于零并将文本字段设置为“错误”。但是,在那之后,您退出 switch 语句并继续label.setText("");
后跟text.setText(String.valueOf(ans));
. 因为 ans 的当前值为零,所以最后一条语句将文本字段的值设置为“0.0”,覆盖之前的“Error”值。有不同的方法来处理它。现在,当您了解问题的原因后,您可以尝试自己找到解决方案。关于您关于如何重置计算器状态的第二个问题。例如,您可以创建一个布尔状态变量,如果计算器准备好接受新输入,则该变量为真,如果它处于某个输入的中间,则该变量为假。您将此状态变量初始化为 true,然后每次按下某个按钮时将其设置为 false。如果状态变量为真,则在向其附加数字之前将文本字段重置为空字符串。最后,在用户按下“=”按钮后,将状态变量设置回 true。因此,您可以执行以下操作:
// We reset the text field to an empty string at the start of each calculation
if (state) {
text.setText("");
}
// Here is your code
.....
// And at the very end:
// Change the state to false if user pressed anything except the equality sign
state = e.getSource()==equ;
- 关于第三个问题如何在没有不必要的精度的情况下显示答案。检查这个线程:Best way to convert a double to String without decimal places。那里有你的问题的答案,即使它不是线程中的第一个答案。
推荐阅读
- scala - Convert spark scala dataset to specific RDD format
- c# - Find and Replace inside of HtmlWebViewSource property
- assembly - 如何在 ARM7 上执行模数?
- matlab - 应用程序设计器点未出现在绘图上
- jenkins - 在 Groovy 脚本中传递命令行输入
- reactjs - I can not deploy react app on github pages
- html - HTML table scraping in R
- hibernate - Spring Data Rest Association GET Override
- c - 无法获取 C 中指针的内容
- python - 如何在 statsmodels 未观察到的组件模型中输入测量噪声?