目录
(1) 实验流程图(软件设计简易流程图+每个按钮添加监听Event,画出监听程序设计流程图)
(4)实验代码、过程、相应结果(截图)并对实验进行说明和分析:
【实验要求】
学习使用图形用户界面(GUI)设计实现一个简单的计算器,能进行+-x/四则运算(注意数字大小的越界考虑,一般计算器输入的数字个数不超过 16个)感兴趣的同学可以自由发挥,可以让你的计算器更加复杂,功能更加强大。
实现方法:
如果使用 FlowLayout布局,当变化窗口尺寸,布局会发生变化建议采用 BorderLayout布局嵌套 GridLayout 布局(如果设计复杂还可以采用 GridBagLayout 布局)首先,学习制作 jar 包,然后将 jar 包制作为 exe 可执行文件(可采用 exe4j软件)。实验报告粘贴 java 代码,并截图运行效果,同时上传jar 包,如果实现了 exe 可执行文件,同时上传 exe 文件。
(1) 实验流程图(软件设计简易流程图+每个按钮添加监听Event,画出监听程序设计流程图)
①标准型计算器+监听流程图
②科学计算器
③进制转换
④绘图
(2) 页面布局设计图
初版+改进版:
(3) 实验源代码(粘贴源代码):
SimpleCalculator.java
package jisuanqi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleCalculator extends JFrame implements ActionListener {
private JTextField inputField; // 用来显示输入的数字和运算符
private double result;//存储计算的中间结果
private String operator;//存储操作符(加、减、乘、除)
private boolean startNewNumber;//布尔变量,用来指示是否开始输入新的数字。
public SimpleCalculator() {
result = 0;//初始化计算器的状态
operator = "=";
startNewNumber = true;
createUI();//调用 createUI 方法来设置用户界面
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu("功能");
menuBar.add(menu);
JMenuItem menuItem = new JMenuItem("标准型");
menu.add(menuItem);
JMenuItem menuItem_1 = new JMenuItem("科学型");
menu.add(menuItem_1);
menuItem_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ScienceCalculator science = new ScienceCalculator();
science.setVisible(true);
SimpleCalculator.this.dispose();
}
} );
// 添加“进制转换”菜单项
JMenuItem convertMenuItem = new JMenuItem("进制转换");
menu.add(convertMenuItem);
convertMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
BaseConverter converter = new BaseConverter();
converter.setVisible(true);
}
});
// 添加“绘图”菜单项
JMenuItem graphMenuItem = new JMenuItem("绘图");
menu.add(graphMenuItem);
graphMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
DrawFn graphingCalculator = new DrawFn();
graphingCalculator.setSize(800, 600); // 设置窗口大小为 800x600
graphingCalculator.setVisible(true);
}
});
// 添加“帮助”菜单
JMenu helpMenu = new JMenu("帮助");
menuBar.add(helpMenu); // 添加到菜单栏
// 添加“帮助”菜单项
JMenuItem helpMenuItem = new JMenuItem("显示帮助");
helpMenu.add(helpMenuItem);
helpMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// 弹出对话框显示帮助信息
JOptionPane.showMessageDialog(SimpleCalculator.this,
"这里是帮助信息。\n" +
"使用科学型计算器的时候再点我吧",
"帮助信息",
JOptionPane.INFORMATION_MESSAGE);
}
});
}
private void createUI() {
//设置窗口的标题、默认关闭操作和布局管理器
setTitle("标准型计算器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 设置字体大小
int fontSize = 20; // 根据需要调整字体大小
Font font = new Font("Consolas", Font.BOLD, fontSize);
inputField = new JTextField("", 16);//文本框的初始内容,文本框的列数
inputField.setFont(font); // 为文本框设置字体
inputField.setEditable(false);//不可编辑,用户只能通过按钮来输入
// 设置文本框的首选大小,使其更宽更高
inputField.setPreferredSize(new Dimension(400, 50));
add(inputField, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel(new GridLayout(5, 4));
//GridLayout布局管理器,将面板分为5行4列的网格
String[] buttonLabels = {//定义按钮标签
"AC", "C", "%", "/",//AC重置计算器的状态 C清空当前输入
"7", "8", "9", "*",
"4", "5", "6", "-",
"1", "2", "3", "+",
"0", ".", "back", "=",
};
for (String label : buttonLabels) {
//遍历buttonLabels数组,为每个标签创建一个JButton对象
JButton button = new JButton(label);
button.setFont(font); // 为按钮设置字体
button.addActionListener(this);//添加了一个事件监听器
buttonPanel.add(button);//其添加到buttonPanel
}
// 特别处理按钮(后加)
int[] tebie = {0,1,2,3,7,11,15};
for (int index : tebie) {
JButton button = (JButton) buttonPanel.getComponent(index);
button.setBorder(BorderFactory.createLineBorder(Color.GRAY)); // 设置边框
button.setBackground(new Color(224,224,224)); // 设置背景颜色
}
JButton button = (JButton) buttonPanel.getComponent(19);
button.setBorder(BorderFactory.createLineBorder(Color.GRAY)); // 设置边框
button.setBackground(new Color(153,204,255)); // 设置背景颜色
add(buttonPanel, BorderLayout.CENTER);//将buttonPanel添加到计算器窗口的中心位置
pack();//调整窗口大小以适应其组件的偏好大小
// setSize(400, 400); // 设置窗口的初始大小
setLocationRelativeTo(null);//窗口居中
}
@Override
public void actionPerformed(ActionEvent e) {
//事件监听器的回调方法,按钮的标签,执行不同的操作
String command = e.getActionCommand();//获取与事件相关联的命令字符串
if ('0' <= command.charAt(0) && command.charAt(0) <= '9' || command.equals(".")) {
//如果 command 是一个数字或小数点,条件为真
if (startNewNumber) {//是否 正在 开始输入一个新的数字
inputField.setText(command);//将输入字段的文本设置为当前命令字符串
startNewNumber = false;//表示已经开始输入
} else {//表示用户正在追加数字
inputField.setText(inputField.getText() + command);
}
}else if (command.equals("AC")) {
result = 0;
operator = "=";
startNewNumber = true;
inputField.setText("");
} else if (command.equals("C")) {
startNewNumber = true;
inputField.setText("");
} else if (command.equals("back")) {
handleBack();
}
else if (command.equals("%")) {
double x = Double.parseDouble(inputField.getText());//文本转换为双精度浮点数
inputField.setText(String.valueOf(x / 100));//: 计算这个数的百分之一,并将结果转换为字符串
startNewNumber = true;
} else {
if (startNewNumber) {
if (command.equals("-")) {//点击的是负号(-)按钮
inputField.setText(command);
startNewNumber = false;
} else {
operator = command;
}
} else {
double x = Double.parseDouble(inputField.getText());
//输入字段中的文本转换为双精度浮点数。
calculate(x);//调用 calculate 方法
operator = command;
startNewNumber = true;
}
}
}
private void handleBack() {
String text = inputField.getText();
int i = text.length();//字符串的长度
if (i > 0) {
text = text.substring(0, i - 1);
if (text.length() == 0) {
inputField.setText("0");
startNewNumber = true;
operator = "=";
}
else
inputField.setText(text);
}
}
private void calculate(double n) {//计算逻辑
switch (operator) {
case "+":
result += n;
break;
case "-":
result -= n;
break;
case "*":
result *= n;
break;
case "/":
if (n != 0) {
result /= n;
} else {
JOptionPane.showMessageDialog(this, "Cannot divide by zero!");
}
break;
case "=":
result = n;
break;
}//结果是否溢出
if (result > Double.MAX_VALUE || result < -Double.MAX_VALUE) {
JOptionPane.showMessageDialog(this, "Result is out of range!");
inputField.setText("Overflow");}
else inputField.setText("" + result);//结果显示在输入字段中
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
SimpleCalculator calculator = new SimpleCalculator();
calculator.setVisible(true);
});
}
}
ScienceCalculator.java
package jisuanqi;// 没有以10为底对数
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class ScienceCalculator extends JFrame implements ActionListener {
private JTextField inputField; // 用来显示已经输入的表达式
private JTextField resultField; // 用来显示最终计算结果
private int indexYN = 0;//出错即设1
private String str = "";//按钮会使str记录中缀
private String angleMode = "RAD"; // 默认角度模式为度数
//显示无用但是删了出错不知道为什么
private Stack<String> stack = new Stack<String>();
//字符串栈 stack,用于存储后缀表达式中的操作数。
private List<String> list = new ArrayList<>();//存储中缀表达式
private Stack<String> fuZhan = new Stack<>();//存储操作符和括号,即运算符栈
private List<String> list2 = new ArrayList<>();//存储最终的后缀表达式
public ScienceCalculator() {
createUI(); // 调用 createUI 方法来设置用户界面
setupMenuBar(); // 设置菜单栏
}
private void setupMenuBar() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu("功能");
menuBar.add(menu);
JMenuItem menuItem = new JMenuItem("标准型");
menu.add(menuItem);
JMenuItem menuItem_1 = new JMenuItem("科学型");
menu.add(menuItem_1);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SimpleCalculator simple = new SimpleCalculator();
simple.setVisible(true);
ScienceCalculator.this.dispose();
}} );
// 添加“进制转换”菜单项
JMenuItem convertMenuItem = new JMenuItem("进制转换");
menu.add(convertMenuItem);
convertMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
BaseConverter converter = new BaseConverter();
converter.setVisible(true);
}
});
// 添加“绘图”菜单项
JMenuItem graphMenuItem = new JMenuItem("绘图");
menu.add(graphMenuItem);
graphMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
DrawFn graphingCalculator = new DrawFn();
graphingCalculator.setSize(800, 600); // 设置窗口大小为 800x600
graphingCalculator.setVisible(true);
}
});
// 添加“帮助”菜单
JMenu helpMenu = new JMenu("帮助");
menuBar.add(helpMenu); // 添加到菜单栏
// 添加“帮助”菜单项
JMenuItem helpMenuItem = new JMenuItem("显示帮助");
helpMenu.add(helpMenuItem);
helpMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// 弹出对话框显示帮助信息
JOptionPane.showMessageDialog(ScienceCalculator.this,
"1. 在输入过程中每两个数值之间必须有运算符,否则报错.\r\n" +
" * 例如:错误:2ln4(5+8), 2sin2 等\r\n" +
" * 正确:2*ln4*(5+8), 2*sin2\r\n"+
"2. 括号一定要成对出现哦\r\n",
"帮助信息&
标签:Java,java,private,add,exp5,JMenuItem,new,public
From: https://blog.csdn.net/junjun_shi/article/details/145082818