写一个项目可以实现计算器界面(计算器结构是有一行空白显示器,每一个数字和符号都会有格子分开)
欢迎
789+
456_
123*
0 .= /
并且可以进行相应计算
用swing实现么?
参考:https://blog.csdn.net/weixin_45918377/article/details/124944196
实现如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener {
private JTextField display;
private JButton button1, button2, button3, button4, button5, button6, button7, button8, button9, button0;
private JButton addButton, subtractButton, multiplyButton, divideButton, equalsButton, clearButton;
private double num1, num2, result;
private String operator;
public Calculator() {
// 设置窗口标题和大小
setTitle("简易计算器");
setSize(300, 300);
// 创建文本框和按钮
display = new JTextField(20);
button1 = new JButton("1");
button2 = new JButton("2");
button3 = new JButton("3");
button4 = new JButton("4");
button5 = new JButton("5");
button6 = new JButton("6");
button7 = new JButton("7");
button8 = new JButton("8");
button9 = new JButton("9");
button0 = new JButton("0");
addButton = new JButton("+");
subtractButton = new JButton("-");
multiplyButton = new JButton("*");
divideButton = new JButton("/");
equalsButton = new JButton("=");
clearButton = new JButton("C");
// 设置按钮的事件监听器
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
button6.addActionListener(this);
button7.addActionListener(this);
button8.addActionListener(this);
button9.addActionListener(this);
button0.addActionListener(this);
addButton.addActionListener(this);
subtractButton.addActionListener(this);
multiplyButton.addActionListener(this);
divideButton.addActionListener(this);
equalsButton.addActionListener(this);
clearButton.addActionListener(this);
// 创建面板并添加组件
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(4, 4));
panel.add(button7);
panel.add(button8);
panel.add(button9);
panel.add(addButton);
panel.add(button4);
panel.add(button5);
panel.add(button6);
panel.add(subtractButton);
panel.add(button1);
panel.add(button2);
panel.add(button3);
panel.add(multiplyButton);
panel.add(button0);
panel.add(equalsButton);
panel.add(clearButton);
panel.add(divideButton);
// 添加文本框和面板到窗口
add(display, BorderLayout.NORTH);
add(panel, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e) {
// 获取按钮的文本
String buttonText = e.getActionCommand();
// 根据按钮的文本执行相应的操作
if (buttonText.equals("+")) {
num1 = Double.parseDouble(display.getText());
operator = "+";
display.setText("");
} else if (buttonText.equals("-")) {
num1 = Double.parseDouble(display.getText());
operator = "-";
display.setText("");
} else if (buttonText.equals("*")) {
num1 = Double.parseDouble(display.getText());
operator = "*";
display.setText("");
} else if (buttonText.equals("/")) {
num1 = Double.parseDouble(display.getText());
operator = "/";
display.setText("");
} else if (buttonText.equals("=")) {
num2 = Double.parseDouble(display.getText());
if (operator.equals("+")) {
result = num1 + num2;
} else if (operator.equals("-")) {
result = num1 - num2;
} else if (operator.equals("*")) {
result = num1 * num2;
} else if (operator.equals("/")) {
result = num1 / num2;
}
display.setText(Double.toString(result));
} else if (buttonText.equals("C")) {
display.setText("");
} else {
display.setText(display.getText() + buttonText);
}
}
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.setVisible(true);
calculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
根据你布局,一个Java FX图形界面程序发你参考,
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Calculator extends Application {
private TextField display;
private double prevValue = 0;
private String operator = "";
private boolean startNewNumber = true;
@Override
public void start(Stage primaryStage) {
// 创建数字键和操作符键
Button btn7 = new Button("7");
Button btn8 = new Button("8");
Button btn9 = new Button("9");
Button btnAdd = new Button("+");
Button btn4 = new Button("4");
Button btn5 = new Button("5");
Button btn6 = new Button("6");
Button btnSubtract = new Button("-");
Button btn1 = new Button("1");
Button btn2 = new Button("2");
Button btn3 = new Button("3");
Button btnMultiply = new Button("*");
Button btn0 = new Button("0");
Button btnDecimal = new Button(".");
Button btnEquals = new Button("=");
Button btnDivide = new Button("/");
// 创建欢迎标签
Label welcomeLabel = new Label("欢迎使用计算器!");
// 创建显示屏
display = new TextField();
display.setAlignment(Pos.CENTER_RIGHT);
display.setEditable(false);
display.setPrefWidth(250);
display.setPadding(new Insets(5));
// 创建布局设计
GridPane gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setHgap(10);
gridPane.setVgap(10);
gridPane.setPadding(new Insets(10, 10, 10, 10));
// 添加数字键和操作符键
gridPane.add(btn7, 0, 1);
gridPane.add(btn8, 1, 1);
gridPane.add(btn9, 2, 1);
gridPane.add(btnAdd, 3, 1);
gridPane.add(btn4, 0, 2);
gridPane.add(btn5, 1, 2);
gridPane.add(btn6, 2, 2);
gridPane.add(btnSubtract, 3, 2);
gridPane.add(btn1, 0, 3);
gridPane.add(btn2, 1, 3);
gridPane.add(btn3, 2, 3);
gridPane.add(btnMultiply, 3, 3);
gridPane.add(btn0, 0, 4);
gridPane.add(btnDecimal, 1, 4);
gridPane.add(btnEquals, 2, 4);
gridPane.add(btnDivide, 3, 4);
// 添加欢迎标签和显示屏
gridPane.add(welcomeLabel, 0, 0, 4, 1);
gridPane.add(display, 0, 5, 4, 1);
// 设置按键事件
btn0.setOnAction(event -> numberButtonPressed("0"));
btn1.setOnAction(event -> numberButtonPressed("1"));
btn2.setOnAction(event -> numberButtonPressed("2"));
btn3.setOnAction(event -> numberButtonPressed("3"));
btn4.setOnAction(event -> numberButtonPressed("4"));
btn5.setOnAction(event -> numberButtonPressed("5"));
btn6.setOnAction(event -> numberButtonPressed("6"));
btn7.setOnAction(event -> numberButtonPressed("7"));
btn8.setOnAction(event -> numberButtonPressed("8"));
btn9.setOnAction(event -> numberButtonPressed("9"));
btnAdd.setOnAction(event -> operatorButtonPressed("+"));
btnSubtract.setOnAction(event -> operatorButtonPressed("-"));
btnMultiply.setOnAction(event -> operatorButtonPressed("*"));
btnDivide.setOnAction(event -> operatorButtonPressed("/"));
btnEquals.setOnAction(event -> equalsButtonPressed());
btnDecimal.setOnAction(event -> decimalButtonPressed());
// 创建场景并显示
Scene scene = new Scene(gridPane);
primaryStage.setTitle("计算器");
primaryStage.setScene(scene);
primaryStage.show();
}
// 数字键的按键事件
private void numberButtonPressed(String number) {
if (startNewNumber) {
display.setText(number);
startNewNumber = false;
} else {
display.setText(display.getText() + number);
}
}
// 操作符键的按键事件
private void operatorButtonPressed(String op) {
prevValue = Double.parseDouble(display.getText());
operator = op;
startNewNumber = true;
}
// 等号键的按键事件
private void equalsButtonPressed() {
double currentValue = Double.parseDouble(display.getText());
if (operator.equals("+")) {
display.setText(Double.toString(prevValue + currentValue));
} else if (operator.equals("-")) {
display.setText(Double.toString(prevValue - currentValue));
} else if (operator.equals("*")) {
display.setText(Double.toString(prevValue * currentValue));
} else if (operator.equals("/")) {
display.setText(Double.toString(prevValue / currentValue));
}
startNewNumber = true;
}
// 小数点键的按键事件
private void decimalButtonPressed() {
if (!display.getText().contains(".")) {
display.setText(display.getText() + ".");
startNewNumber = false;
}
}
public static void main(String[] args) {
launch(args);
}
}
以下是一个简单的示例代码,实现了一个基于命令行界面的计算器:
# 计算器界面
def calculator_interface():
display = '' # 显示器上的内容
# 清空显示器
def clear_display():
nonlocal display
display = ''
# 更新显示器内容
def update_display(value):
nonlocal display
display += value
# 计算结果
def calculate_result():
nonlocal display
try:
result = eval(display)
display = str(result)
except ZeroDivisionError:
display = 'Error: Division by zero'
except Exception:
display = 'Error: Invalid expression'
# 运行计算器
while True:
print("Calculator:")
print("Display:", display)
print("Enter a number or operator (+, -, *, /, =) or 'q' to quit:")
user_input = input()
if user_input == 'q':
break
elif user_input == 'c':
clear_display()
elif user_input in ['+', '-', '*', '/']:
update_display(user_input)
elif user_input == '=':
calculate_result()
else:
try:
float(user_input)
update_display(user_input)
except ValueError:
print("Invalid input. Please enter a valid number or operator.")
# 运行计算器界面
calculator_interface()
运行该代码后,你可以在命令行界面输入数字和符号,然后按下 Enter 键执行相应的操作。计算结果将在显示器上显示。按 'q' 键退出计算器。
请注意,这只是一个简单的示例,没有进行输入验证和错误处理。在实际项目中,你可能需要添加更多的功能和逻辑来满足特定的需求,并确保计算器能够处理各种情况下的输入和计算。
不知道你这个问题是否已经解决, 如果还没有解决的话:分析:
本问题描述的是一个简单的计算器界面,需要实现基本的加减乘除等四则运算和小数计算,需要注意布局、监听事件、计算逻辑等细节问题。
解决方案:
布局:可以使用Java Swing等图形库来实现计算器的界面布局,在布局中应该一个包含一个空白显示器和下方由数字和符号格子排列而成的面板,数字和符号应该以按钮的形式出现。
监听事件:对于每一个数字和符号按钮,需要为其添加监听事件,以响应用户的点击,事件触发时获取按钮上的字符并显示在显示器上。
计算逻辑:当用户输入表达式并按下“=”按钮时,需要对表达式进行计算,并在显示器上展示结果。可以使用栈来完成计算逻辑,例如将操作数压入栈中,遇到符号则弹出栈顶两个操作数进行计算,再将结果压入栈中,直到表达式全部计算完毕。
提示:
布局可以使用Swing和AWT两种图形库,可以参考以下链接:
AWT文档:https://docs.oracle.com/javase/8/docs/api/java/awt/package-summary.html
Swing文档:https://docs.oracle.com/javase/8/docs/api/javax/swing/package-summary.html
监听事件可以使用Swing的ActionListener接口,可以参考以下链接:
ActionListener文档:https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html
计算逻辑可以使用栈来实现:
栈的实现可以使用Java自带的Stack类或者手动实现一个栈。
代码实现:
以下是一个简单的计算器实现代码,仅供参考。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;
public class Calculator extends JFrame {
private JTextField display;
private String expression;
private Stack<Double> numberStack;
private Stack<Character> operatorStack;
public Calculator() {
// 初始化界面
super("Calculator");
setSize(300, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 显示器
display = new JTextField();
display.setEditable(false);
display.setBackground(Color.WHITE);
add(display, BorderLayout.NORTH);
// 数字和符号面板
JPanel panel = new JPanel(new GridLayout(4, 4, 5, 5));
// 数字按钮
for (int i = 9; i >= 0; i--) {
addButton(String.valueOf(i));
}
addButton(".");
addButton("=");
// 符号按钮
addButton("/");
addButton("*");
addButton("-");
addButton("+");
add(panel, BorderLayout.CENTER);
setVisible(true);
// 初始化变量
expression = "";
numberStack = new Stack<>();
operatorStack = new Stack<>();
}
/**
* 添加按钮到面板上
* @param s 按钮上的字符
*/
private void addButton(String s) {
JButton button = new JButton(s);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String action = button.getText();
if (action.matches("\\d") || action.equals(".")) {
// 如果是数字或小数点则直接显示在显示器上
expression += action;
display.setText(expression);
} else if (action.equals("=")) {
// 如果是等号则计算表达式
calculate();
} else {
// 如果是符号则压入栈中
expression += action;
operatorStack.push(action.charAt(0));
}
}
});
panel.add(button);
}
/**
* 计算表达式
*/
private void calculate() {
// 使用正则表达式分离数字和符号
String[] tokens = expression.split("(?<=[-+*/])|(?=[-+*/])");
boolean nextNegative = false;
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if (token.matches("\\d+") || token.equals(".")) {
// 如果是数字或小数点则压入栈中
Double number = Double.parseDouble(token);
if (nextNegative) {
number = -number;
nextNegative = false;
}
numberStack.push(number);
} else if (token.equals("-")) {
// 处理负号
if (i == 0 || tokens[i - 1].matches("[+*/(-]")) {
nextNegative = true;
} else {
// 如果是减号则把减法转换为加法
operatorStack.push('+');
}
} else {
// 如果是其他符号则处理栈中的操作数
char operator = token.charAt(0);
while (!operatorStack.isEmpty() && shouldCalculate(operatorStack.peek(), operator)) {
Double b = numberStack.pop();
Double a = numberStack.pop();
numberStack.push(calculate(a, b, operatorStack.pop()));
}
operatorStack.push(operator);
}
}
// 如果表达式最后一个字符是符号则需要补0
if (!numberStack.isEmpty() && numberStack.size() == operatorStack.size()) {
numberStack.push(0.0);
}
// 处理剩余操作
while (!operatorStack.isEmpty()) {
Double b = numberStack.pop();
Double a = numberStack.pop();
numberStack.push(calculate(a, b, operatorStack.pop()));
}
// 显示结果
double result = numberStack.pop();
expression = "";
numberStack.clear();
operatorStack.clear();
display.setText(String.format("%.2f", result));
}
/**
* 判断两个操作符是否应该进行计算,用于优先级比较
* @param a 操作符1
* @param b 操作符2
* @return 是否应该进行计算
*/
private boolean shouldCalculate(char a, char b) {
if (a == '+' || a == '-') {
return true;
} else if ((a == '*' || a == '/') && (b == '*' || b == '/')) {
return true;
} else {
return false;
}
}
/**
* 计算两个操作数的结果
* @param a 操作数1
* @param b 操作数2
* @param op 操作符
* @return 运算结果
*/
private double calculate(double a, double b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
public static void main(String[] args) {
new Calculator();
}
}
运行效果:
如下图所示。