我的JavaFX/Java计算器有问题。当我输入一个方程式时,它(计算器)工作正常,答案也正确。但是,当我在另一个操作中按下/键,然后再按下另一个数字时,结果/和/等将不正确,除非我按下/键的运算符与之前相同。下面是一个例子:
工程量:26=82=10
不起作用:26=8-2=10
工程:6x2=12x2=26
不起作用:6x2=12÷2=26
我想知道有没有办法解决这个问题。
这是我的FXML控制器类:
package calculator;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;
import java.lang.Math;
public class Calculator implements Initializable {
double data = 0d;
int operation = -1;
private boolean start = false;
@FXML
private Label display;
@FXML
private Button two;
@FXML
private Button five;
@FXML
private Button four;
@FXML
private Button three;
@FXML
private Button one;
@FXML
private Button six;
@FXML
private Button seven;
@FXML
private Button multi;
@FXML
private Button add;
@FXML
private Button divide;
@FXML
private Button minus;
@FXML
private Button equals;
@FXML
private Button clear;
@FXML
private Button zero;
@FXML
private Button nine;
@FXML
private Button eight;
@FXML
void handleButtonAction(ActionEvent event) {
if(start)
{
display.setText("");
start = false;
}
if(event.getSource() == one)
{
display.setText(display.getText() + "1");
}
else if(event.getSource() == two)
{
display.setText(display.getText() + "2");
}
else if(event.getSource() == three)
{
display.setText(display.getText() + "3");
}
else if(event.getSource() == four)
{
display.setText(display.getText() + "4");
}
else if(event.getSource() == five)
{
display.setText(display.getText() + "5");
}
else if(event.getSource() == six)
{
display.setText(display.getText() + "6");
}
else if(event.getSource() == seven)
{
display.setText(display.getText() + "7");
}
else if(event.getSource() == eight)
{
display.setText(display.getText() + "8");
}
else if(event.getSource() == nine)
{
display.setText(display.getText() + "9");
}
else if(event.getSource() == zero)
{
display.setText(display.getText() + "0");
}
else if(event.getSource() == clear)
{
display.setText("");
}
else if(event.getSource() == add)
{
data = Float.parseFloat(display.getText());
operation = 1;
display.setText("");
}
else if(event.getSource() == minus)
{
data = Float.parseFloat(display.getText());
operation = 2;
display.setText("");
}
else if(event.getSource() == multi)
{
data = Float.parseFloat(display.getText());
operation = 3;
display.setText("");
}
else if(event.getSource() == divide)
{
data = Float.parseFloat(display.getText());
operation = 4;
display.setText("");
}
else if(event.getSource() == equals)
{
Float secondOperand = Float.parseFloat(display.getText());
switch(operation)
{
case 1: //Addition
Double ans = data + secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 2: //Subtraction
ans = data - secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 3: //Multiplication
ans = data * secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 4: //Division
ans = 0d;
try{
ans = data / secondOperand;
}catch(Exception ex){display.setText("Error");}
display.setText(String.valueOf(ans));
//data = ans;
break;
}
if(event.getSource() != divide && event.getSource() != add && event.getSource() != multi && event.getSource() != minus)
{
start = true;
}
}
}
@FXML
private void send2sceneconver(ActionEvent event) throws Exception{
Parent rootBMI = FXMLLoader.load(getClass().getResource("ConversionCal.fxml"));
Scene scene2 = new Scene(rootBMI);
Stage calS = (Stage) ((Node) event.getSource()).getScene().getWindow();
calS.setScene(scene2);
calS.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
任何帮助都将不胜感激。
我还想出了另一种方法,在[data=]之前声明[operation=],如下所示:
else if(event.getSource() == divide)
{
operation = -1;
operation = 4;
data = Float.parseFloat(display.getText());
display.setText("");
dot.setDisable(false);
}
所以我不太确定为什么会有,但问题是这种说法
if(start)
{
display.setText("");
start = false;
}
我已经用你的works vs Not work方程式测试过了,一切似乎都很好。破坏它的原因是它在执行下一个操作时重置了显示,因此在观看时看起来很好,但在尝试执行该操作时,数据被清除。所以它没有最后的数据可供提取。我把它注释掉了,剩下的似乎都可以用了,这里是我的课堂,以供验证
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import java.net.URL;
import java.util.ResourceBundle;
public class Calculator implements Initializable {
double data = 0d;
int operation = -1;
private boolean start = false;
@FXML
private Label display;
@FXML
private Button two;
@FXML
private Button five;
@FXML
private Button four;
@FXML
private Button three;
@FXML
private Button one;
@FXML
private Button six;
@FXML
private Button seven;
@FXML
private Button multi;
@FXML
private Button add;
@FXML
private Button divide;
@FXML
private Button minus;
@FXML
private Button equals;
@FXML
private Button clear;
@FXML
private Button zero;
@FXML
private Button nine;
@FXML
private Button eight;
@FXML
void handleButtonAction(ActionEvent event) {
// if(start)
// {
// display.setText("");
// start = false;
// }
if(event.getSource() == one)
{
display.setText(display.getText() + "1");
}
else if(event.getSource() == two)
{
display.setText(display.getText() + "2");
}
else if(event.getSource() == three)
{
display.setText(display.getText() + "3");
}
else if(event.getSource() == four)
{
display.setText(display.getText() + "4");
}
else if(event.getSource() == five)
{
display.setText(display.getText() + "5");
}
else if(event.getSource() == six)
{
display.setText(display.getText() + "6");
}
else if(event.getSource() == seven)
{
display.setText(display.getText() + "7");
}
else if(event.getSource() == eight)
{
display.setText(display.getText() + "8");
}
else if(event.getSource() == nine)
{
display.setText(display.getText() + "9");
}
else if(event.getSource() == zero)
{
display.setText(display.getText() + "0");
}
else if(event.getSource() == clear)
{
display.setText("");
}
else if(event.getSource() == add)
{
data = Float.parseFloat(display.getText());
operation = 1;
display.setText("");
}
else if(event.getSource() == minus)
{
data = Float.parseFloat(display.getText());
operation = 2;
display.setText("");
}
else if(event.getSource() == multi)
{
data = Float.parseFloat(display.getText());
operation = 3;
display.setText("");
}
else if(event.getSource() == divide)
{
data = Float.parseFloat(display.getText());
operation = 4;
display.setText("");
}
else if(event.getSource() == equals)
{
Float secondOperand = Float.parseFloat(display.getText());
switch(operation)
{
case 1: //Addition
Double ans = data + secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 2: //Subtraction
ans = data - secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 3: //Multiplication
ans = data * secondOperand;
display.setText(String.valueOf(ans));
//data = ans;
break;
case 4: //Division
ans = 0d;
try{
ans = data / secondOperand;
}catch(Exception ex){display.setText("Error");}
display.setText(String.valueOf(ans));
//data = ans;
break;
}
// if(event.getSource() != divide && event.getSource() != add && event.getSource() != multi && event.getSource() != minus)
// {
// start = true;
// }
}
}
@FXML
private void send2sceneconver(ActionEvent event) throws Exception{
Parent rootBMI = FXMLLoader.load(getClass().getResource("ConversionCal.fxml"));
Scene scene2 = new Scene(rootBMI);
Stage calS = (Stage) ((Node) event.getSource()).getScene().getWindow();
calS.setScene(scene2);
calS.show();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
另请注意,如果未使用implements Initializable
,则可以将其删除
按下equals
按钮可执行以下操作
else if(event.getSource() == equals)
{
...
if(event.getSource() != divide && event.getSource() != add && event.getSource() != multi && event.getSource() != minus)
{
start = true;
}
}
由于source
是等于
且没有其他值,因此您总是将start
设置为true
,按下下一步按钮时,该设置会将显示的内容替换为空字符串:
if(start)
{
display.setText("");
start = false;
}
这将导致下一个调用引发一个
NumberFormatExcture
data = Float.parseFloat(display.getText());
由于对
操作
字段的赋值发生在本次调用之后,因此仅在按下等于
后按下运算符按钮不会导致字段值的更新,并且始终保留旧运算符。
您应该做的是引入一个字段,告诉您第一个操作数是否可用或必须进行解析。
private final Set<Button> numbers = new HashSet<>();
private final Map<Button, Integer> operators = new HashMap<>();
@Override
public void initialize(URL url, ResourceBundle rb) {
numbers.addAll(Arrays.asList(zero, one, two, three, four, five, six, seven, eight, nine));
operators.put(add, 1);
operators.put(minus, 2);
operators.put(multi, 3);
operators.put(divide, 4);
}
private double data;
private boolean dataAvailable = false;
@FXML
private void handleButtonAction(ActionEvent event) {
Button source = (Button) event.getSource();
if (source == clear) {
dataAvailable = false;
display.setText("");
operation = 0;
} else if (source == equals) {
double secondOperand;
try {
secondOperand = Double.parseDouble(display.getText());
} catch (NumberFormatException ex) {
return; // only continue, if parsing is successful
}
double result;
switch (operation) {
case 1: //Addition
result = data + secondOperand;
break;
case 2: //Subtraction
result = data - secondOperand;
break;
case 3: //Multiplication
result = data * secondOperand;
break;
case 4: //Division
double res = data / secondOperand;
if (Double.isFinite(res)) {
result = res;
} else {
// TODO: division by zero
}
break;
default:
return; // ignore press, if operand is not set yet
}
display.setText(Double.toString(result));
operation = 0;
data = result;
dataAvailable = true;
} else if (numbers.contains(source)) {
if (!dataAvailable) { // just ignore input, if = gave us the first operand
display.setText(display.getText() + source.getText());
}
} else {
Integer op = operators.get(source);
if (op != null) {
if (!dataAvailable) {
try {
data = Double.parseDouble(display.getText());
} catch (NumberFormatException ex) {
return; // do nothing on invalid input
}
} else {
dataAvailable = false;
}
display.setText("");
operation = op;
}
}
}
我正在为学校开发一个简单的JavaFX计算器,我被困在一起,我被困在一起,该事件从两个文本字段,选择的单选按钮以及按下计算按钮时执行该事件的输入放在一起。 节目预览
我试图显示一个计时器,它在点击开始按钮后计数并在标签中显示秒数,但我没有得到想要的输出。这是我的控制器代码和FXML文件。。。 这是我的FXML代码...
我正在尝试创建一个JavaFX程序,该程序从用户那里获取第一个数字和第二个数字,并根据用户选择的按钮进行加法,乘法,减法或除法,并在文本字段中显示结果。我已经创建了这些方法并正确设置了我的类,但我不确定为什么当我单击按钮时我的事件不起作用。任何类型的指导将不胜感激。我也在使用Eclipse。谢谢 主要.java Controller.java fxml.java
因此,我希望当您输入支票金额和小费百分比并单击“计算小费”按钮时,它将运行函数,innerHTML将函数的输出写入div容器中的页面。然而,当我点击按钮时,似乎什么也没发生。如果有人有任何帮助/指导,我将不胜感激。
问题内容: 最近,我研究了可以加,减,乘和除的简单计算器。 但是,如果我想让程序像普通计算器一样工作,该怎么办?它加,减,乘,除,…,但不仅是两个,而是多个。 问题答案: 当然可以做到!尽管需要实质性的框架。但是,如果要使用这种简单的代码,则需要将数字存储在此函数之外的其他位置,并且将要对其进行操作的每两个数字进行存储,并将其用作第一个参数您要使用的第三个。等等。这有意义吗?
问题内容: 嘿,我是Java的初学者,而且我只是做了很短的时间,无论如何,对于我的Java基础项目,我需要用gui做一个简单的计算器,我想不是那样的辛苦但是我有点错:P我已经尽了最大的努力(我认为),但是在操作的事件处理和设置要计算的值上陷入了atm,这是我的代码,请您给我一些建议或技巧关于如何做到这一点:D 我的处理程序只是基本的处理程序,它们将数字打印到控制台中,因此您可以不理会它们,我看到了