java Java简单计算器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17393957/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java Simple Calculator
提问by Lahiru Kavinda
I have made this calculator program in Java. This works well only when two numbers are calculated at one time. That means to get the sum of 1+2+3 you have to go this way : press 1 press + press 2 press = press + press 3 press =
我用 Java 制作了这个计算器程序。这仅在一次计算两个数字时才有效。这意味着要获得 1+2+3 的总和,您必须这样做:按 1 按 + 按 2 按 = 按 + 按 3 按 =
and it calculates it as 6.
并将其计算为 6。
But I want to program this so that I can get the answer by: press 1 press + press 2 press + press 3 press =
但我想对此进行编程,以便我可以通过以下方式得到答案:按 1 按 + 按 2 按 + 按 3 按 =
but this gives the answer 5!!! How to code this so that it works like an ordinary calculator?
但这给出了答案 5!!!如何编写代码使其像普通计算器一样工作?
Here is my code:
这是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class cal1 extends JFrame {
double op1 = 0d, op2 = 0d;
double result = 0d;
char action;
boolean b = false;
boolean pressequal = false;
public cal1() {
makeUI();
}
private void makeUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
b0 = new JButton("0");
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
bDot = new JButton(".");
bMul = new JButton("*");
bDiv = new JButton("/");
bPlus = new JButton("+");
bMinus = new JButton("-");
bEq = new JButton("=");
t = new JTextField(12);
t.setFont(new Font("Tahoma", Font.PLAIN, 24));
t.setHorizontalAlignment(JTextField.RIGHT);
numpad = new JPanel();
display = new JPanel();
numpad.add(b7);
numpad.add(b8);
numpad.add(b9);
numpad.add(bMul);
numpad.add(b4);
numpad.add(b5);
numpad.add(b6);
numpad.add(bDiv);
numpad.add(b1);
numpad.add(b2);
numpad.add(b3);
numpad.add(bMinus);
numpad.add(bDot);
numpad.add(b0);
numpad.add(bEq);
numpad.add(bPlus);
numpad.setLayout(new GridLayout(4, 5, 5, 4));
display.add(t);
add(display, BorderLayout.NORTH);
add(numpad, BorderLayout.CENTER);
t.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
typeOnt(e);
}
});
b0.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b0pressed(e);
}
});
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b1pressed(e);
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b2pressed(e);
}
});
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b3pressed(e);
}
});
b4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b4pressed(e);
}
});
b5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b5pressed(e);
}
});
b6.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b6pressed(e);
}
});
b7.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b7pressed(e);
}
});
b8.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b8pressed(e);
}
});
b9.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
b9pressed(e);
}
});
bDot.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bDotpressed(e);
}
});
bPlus.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bPlusPressed(e);
}
});
bMinus.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bMinusPressed(e);
}
});
bMul.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bMulPressed(e);
}
});
bDiv.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bDivPressed(e);
}
});
bEq.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bEqpressed(e);
}
});
}
void typeOnt(KeyEvent e) {
e.consume();
}
void b0pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "0");
} else {
t.setText(t.getText() + "0");
}
}
void b1pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "1");
} else {
t.setText(t.getText() + "1");
}
}
void b2pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "2");
} else {
t.setText(t.getText() + "2");
}
}
void b3pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "3");
} else {
t.setText(t.getText() + "3");
}
}
void b4pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "4");
} else {
t.setText(t.getText() + "4");
}
}
void b5pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "5");
} else {
t.setText(t.getText() + "5");
}
}
void b6pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "6");
} else {
t.setText(t.getText() + "6");
}
}
void b7pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "7");
} else {
t.setText(t.getText() + "7");
}
}
void b8pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "8");
} else {
t.setText(t.getText() + "8");
}
}
void b9pressed(ActionEvent e) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "9");
} else {
t.setText(t.getText() + "9");
}
}
void bDotpressed(ActionEvent e) {
if (!t.getText().contains(".")) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + "0.");
} else if (t.getText().isEmpty()) {
t.setText("0.");
} else {
t.setText(t.getText() + ".");
}
}
}
void bPlusPressed(ActionEvent e) {
b = true;
action = '+';
op1 = Double.parseDouble(t.getText());
}
void bMinusPressed(ActionEvent e) {
b = true;
action = '-';
op1 = Double.parseDouble(t.getText());
}
void bMulPressed(ActionEvent e) {
b = true;
action = '*';
op1 = Double.parseDouble(t.getText());
}
void bDivPressed(ActionEvent e) {
b = true;
action = '/';
op1 = Double.parseDouble(t.getText());
}
void bEqpressed(ActionEvent e) {
op2 = Double.parseDouble(t.getText());
doCal();
}
void doCal() {
switch (action) {
case '+': result = op1 + op2; break;
case '-': result = op1 - op2; break;
case '*': result = op1 * op2; break;
case '/': result = op1 / op2; break;
}
t.setText(String.valueOf(result));
}
public static void main(String[] args) {
new cal1().setVisible(true);
}
JButton b0;
JButton b1;
JButton b2;
JButton b3;
JButton b4;
JButton b5;
JButton b6;
JButton b7;
JButton b8;
JButton b9;
JButton bDot;
JButton bPlus;
JButton bMinus;
JButton bMul;
JButton bDiv;
JButton bEq;
JPanel display;
JPanel numpad;
JTextField t;
}
采纳答案by imulsion
Get the calculation as a string and use ScriptEngine:
以字符串形式获取计算并使用 ScriptEngine:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
t.setText(engine.eval(calculation_String));
回答by nachokk
First in Java classes should be start with first letter UpperCase Java Code Conventions
Java 类中的第一个应该以首字母大写Java 代码约定开头
Second instead of creating a method for each number
第二种而不是为每个数字创建一个方法
void bpressed(ActionEvent e, Integer number) {
if (b) {
t.setText(null);
b = false;
t.setText(t.getText() + number);
} else {
t.setText(t.getText() + number);
}
}
Use declarative names for things, what is b? it is not intuitive, class name should be Calculator or something like this, code must be readable for humans.
对事物使用声明性名称,b 是什么?它不直观,类名应该是 Calculator 或类似的东西,代码必须对人类可读。
Related to your question you can have a partialResult
when some operation is in progress.
For example:
与您的问题相关,partialResult
当某些操作正在进行时,您可以有一个。例如:
you declare
你声明
private double partialResult=0D;
and a method something like this
和这样的方法
private void calculatePartialResult(Integer numberSelected){
//choose depends on action
partialResult op= numberSelected; (where op in + - * /)
}
回答by Rapha?l
When doing 1 + 2 + 3 your current code is doing :
执行 1 + 2 + 3 时,您当前的代码正在执行:
User tap on '1' '+'
op1 = 1.0, action = '+'
User tap on '2' '+'
op1 = 2.0, action = '+'
User tap on '3' '='
op1 = 2.0, op2 = 3.0, action = '+'
doCal() displays the result of op1 + op2 which is 5
I think that you should use op1
to store the value of the previous calculations to obtain the behavior you are expecting.
我认为您应该使用op1
来存储先前计算的值以获得您期望的行为。
Here is how I would do it.
这是我将如何做到的。
Instead of calling doCal()
only when equal is pressed, call it every time an operator is pressed, at the start of the operator action handler.
Store the value inside of op2
, to allow the calculation to take place :
不是doCal()
仅在按下 equal 时调用,而是在每次按下运算符时调用它,在运算符动作处理程序的开始。将值存储在 中op2
,以允许进行计算:
void bPlusPressed(ActionEvent e) {
op2 = Double.parseDouble(t.getText());
doCal();
b = true;
action = '+';
}
(Apply the same changes for the other operators).
(对其他运算符应用相同的更改)。
Inside of doCal()
, store the result into op1
instead of displaying it :
在 内部doCal()
,将结果存储到op1
而不是显示它:
void doCal() {
// No need to use a class attribute for result, prefer a local variable.
final double result;
switch (action) {
case '+': result = op1 + op2; break;
case '-': result = op1 - op2; break;
case '*': result = op1 * op2; break;
case '/': result = op1 / op2; break;
// When no action is set, simply copy op2 into op1
default: result = op2;
}
op1 = result;
}
Then, change bEqPressed()
to make it display op1
and reset the value of action
:
然后,更改bEqPressed()
以使其显示op1
并重置 的值action
:
void bEqpressed(ActionEvent e) {
op2 = Double.parseDouble(t.getText());
doCal();
t.setText(String.valueOf(result));
action = '##代码##';
}
This should do the trick.
这应该可以解决问题。