java计算器2、8、10进制。切换进制时数据清空。
时间: 2024-03-06 14:50:30 浏览: 23
以下是一个简单的 Java 计算器,支持 2、8、10 进制的运算,并且在切换进制时会清空已经输入的数据:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener {
private JTextField inputField;
private JLabel modeLabel;
private JButton[] numberButtons;
private JButton[] operatorButtons;
private JButton[] modeButtons;
private int mode = 10;
private String input = "";
private boolean clearInput = false;
public Calculator() {
setTitle("Calculator");
setSize(300, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel);
inputField = new JTextField();
inputField.setBounds(10, 10, 270, 30);
inputField.setEditable(false);
panel.add(inputField);
modeLabel = new JLabel("Mode: 10");
modeLabel.setBounds(10, 50, 60, 20);
panel.add(modeLabel);
numberButtons = new JButton[16];
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].setBounds(i * 30 + 10, 80, 30, 30);
numberButtons[i].addActionListener(this);
panel.add(numberButtons[i]);
}
numberButtons[10] = new JButton("A");
numberButtons[10].setBounds(10, 140, 30, 30);
numberButtons[10].addActionListener(this);
panel.add(numberButtons[10]);
numberButtons[11] = new JButton("B");
numberButtons[11].setBounds(40, 140, 30, 30);
numberButtons[11].addActionListener(this);
panel.add(numberButtons[11]);
numberButtons[12] = new JButton("C");
numberButtons[12].setBounds(70, 140, 30, 30);
numberButtons[12].addActionListener(this);
panel.add(numberButtons[12]);
numberButtons[13] = new JButton("D");
numberButtons[13].setBounds(100, 140, 30, 30);
numberButtons[13].addActionListener(this);
panel.add(numberButtons[13]);
numberButtons[14] = new JButton("E");
numberButtons[14].setBounds(130, 140, 30, 30);
numberButtons[14].addActionListener(this);
panel.add(numberButtons[14]);
numberButtons[15] = new JButton("F");
numberButtons[15].setBounds(160, 140, 30, 30);
numberButtons[15].addActionListener(this);
panel.add(numberButtons[15]);
operatorButtons = new JButton[6];
operatorButtons[0] = new JButton("+");
operatorButtons[0].setBounds(200, 80, 30, 30);
operatorButtons[0].addActionListener(this);
panel.add(operatorButtons[0]);
operatorButtons[1] = new JButton("-");
operatorButtons[1].setBounds(200, 110, 30, 30);
operatorButtons[1].addActionListener(this);
panel.add(operatorButtons[1]);
operatorButtons[2] = new JButton("*");
operatorButtons[2].setBounds(200, 140, 30, 30);
operatorButtons[2].addActionListener(this);
panel.add(operatorButtons[2]);
operatorButtons[3] = new JButton("/");
operatorButtons[3].setBounds(230, 80, 30, 30);
operatorButtons[3].addActionListener(this);
panel.add(operatorButtons[3]);
operatorButtons[4] = new JButton("=");
operatorButtons[4].setBounds(230, 110, 30, 60);
operatorButtons[4].addActionListener(this);
panel.add(operatorButtons[4]);
operatorButtons[5] = new JButton("C");
operatorButtons[5].setBounds(10, 180, 60, 30);
operatorButtons[5].addActionListener(this);
panel.add(operatorButtons[5]);
modeButtons = new JButton[3];
modeButtons[0] = new JButton("2");
modeButtons[0].setBounds(80, 50, 40, 20);
modeButtons[0].addActionListener(this);
panel.add(modeButtons[0]);
modeButtons[1] = new JButton("8");
modeButtons[1].setBounds(130, 50, 40, 20);
modeButtons[1].addActionListener(this);
panel.add(modeButtons[1]);
modeButtons[2] = new JButton("10");
modeButtons[2].setBounds(180, 50, 50, 20);
modeButtons[2].addActionListener(this);
panel.add(modeButtons[2]);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("+")) {
input += "+";
} else if (command.equals("-")) {
input += "-";
} else if (command.equals("*")) {
input += "*";
} else if (command.equals("/")) {
input += "/";
} else if (command.equals("=")) {
input = evaluate(input);
} else if (command.equals("C")) {
input = "";
clearInput = true;
} else if (command.equals("2")) {
mode = 2;
input = "";
clearInput = true;
modeLabel.setText("Mode: 2");
} else if (command.equals("8")) {
mode = 8;
input = "";
clearInput = true;
modeLabel.setText("Mode: 8");
} else if (command.equals("10")) {
mode = 10;
input = "";
clearInput = true;
modeLabel.setText("Mode: 10");
} else {
int value = Integer.parseInt(command, mode);
input += Integer.toString(value, 10);
}
inputField.setText(input);
}
private String evaluate(String input) {
String[] tokens = input.split(" ");
int op1 = Integer.parseInt(tokens[0], mode);
int op2 = Integer.parseInt(tokens[2], mode);
int result = 0;
switch (tokens[1]) {
case "+":
result = op1 + op2;
break;
case "-":
result = op1 - op2;
break;
case "*":
result = op1 * op2;
break;
case "/":
result = op1 / op2;
break;
}
return Integer.toString(result, mode);
}
public static void main(String[] args) {
new Calculator();
}
}
```
在上面的代码中,我们使用了一个 JTextField 来显示输入和输出的结果,用若干个 JButton 实现了数字、操作符和模式选择的按钮,并且通过实现 ActionListener 接口来处理按钮的事件。在 actionPerformed() 方法中,我们根据用户的选择更新 input 字符串的值,并且在 inputField 中显示出来。当用户选择模式切换时,我们需要重新设置 mode 变量的值,并且清空 input 字符串。当用户选择计算时,我们调用 evaluate() 方法来计算表达式的值,并且将结果以当前模式的形式显示在 inputField 中。
需要注意的是,当用户在切换模式时,我们需要将 clearInput 变量设置为 true,否则用户在输入数字时会出现错误。