Java实验-Swing 计算器
实验要求:
- 计算器软件是非常实用的工具
请用Java图形界面的知识,编写以上软件。
- 仅用JButton、JTextField两个组件和JFrame窗口实现。
- 实现基本的加减乘除运算。
代码:
GridLayout布局方式的主类:
package com.junlin.exer4;
public class JavaMain {
public static void main(String[] args) {
Calculator calc = new Calculator("xxx_计算器");
}
}
GridLayout布局方式的计算器界面类:
package com.junlin.exer4;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
public class Calculator extends JFrame {
private final JTextArea textArea;
private String firstNum = ""; //第一个数
private String op = ""; //操作符
private String secondNum = ""; //第二个数
private String showText = ""; //要展示在文本框中的文字
private String result = "";
private double eps = 1e-8;
public Calculator(String title) {
super(title);
this.setSize(402,627);
this.setLayout(null);
this.setBackground(new Color(241, 241, 241));
JPanel head = new JPanel();
head.setLayout(new BorderLayout());
head.setPreferredSize(new Dimension(402,50));
head.add(new JLabel("简单计算器", JLabel.CENTER), BorderLayout.CENTER);
head.setBackground(new Color(242, 242, 242));
this.add(head);
head.setBounds(0,0, this.getWidth(), 30);
textArea = new JTextArea();
textArea.setColumns(3);
textArea.setText("0");
textArea.setFont(new Font("宋体",Font.BOLD,25));
this.add(textArea);
textArea.setBounds(10, 50, this.getWidth() - 20, 100);
addButton();
this.setVisible(true);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void refreshShowText(String text) {
showText = text;
textArea.setText(text);
}
private void refreshResult(String result) {
refreshShowText(result);
firstNum = result;
this.result = result;
secondNum = "";
op = "";
}
private Object processNum(double res) {
System.out.println(res);
if(Math.abs(((int)res - res)) <= eps) {
return (int)res;
}else {
String s = String.format("%.2f",res);
return Double.parseDouble(s);
}
}
//向界面中添加按钮
private void addButton() {
String[] candidate = {"CE", "÷", "x", "C", "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "√", "1/x", "0", ".", "="};
int len = candidate.length;
JPanel panel = new JPanel();
panel.setLayout(null);
for(int i = 0;i < len;i++) {
String text = candidate[i];
JButton button = new JButton(text);
Font f = new Font("宋体",Font.BOLD,16);
button.setFont(f);
button.setBackground(new Color(224, 224, 224));
button.setBounds((i % 4) * 80 + (i % 4) * 10, (i / 4) * 70 + (i / 4) * 10, 85, 70);
panel.add(button);
button.addActionListener(e -> {
switch (text) {
case "C":
refreshResult("");
break;
case "CE":
break;
case "+":
case "-":
case "x":
case "÷":
if(!firstNum.equals("") && op.equals("")) {
op = text;
refreshShowText(showText + op);
}
break;
case "1/x":
if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
double res = 1.0 / Double.parseDouble(firstNum);
refreshResult(String.valueOf(processNum(res)));
}
break;
case "√":
if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
double res = Math.sqrt(Double.parseDouble(firstNum));
refreshResult(String.valueOf(processNum(res)));
}
break;
case ".":
break;
case "=":
if(!firstNum.equals("") && !op.equals("") && !secondNum.equals("")) {
double res = 0.0;
switch (op) {
case "+":
res = Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
break;
case "-":
res = Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
break;
case "x":
res = Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
break;
case "÷":
res = Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
break;
}
refreshResult(String.valueOf(processNum(res)));
}
break;
default: //数字
if(op.equals("")) {
if(result.equals("")) {
firstNum += text;
}
else {
refreshResult("");
firstNum = text;
}
}else {
secondNum += text;
}
refreshShowText(showText + text);
break;
}
});
}
panel.setBounds(20, 160, this.getWidth() - 30, this.getHeight() - 50 - 100 - 60);
this.add(panel);
}
}
你只管出发,旅途自有风景~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具