首页 > 编程语言 >Java-exp5

Java-exp5

时间:2025-01-15 21:57:44浏览次数:3  
标签:Java java private add exp5 JMenuItem new public

目录

(1) 实验流程图(软件设计简易流程图+每个按钮添加监听Event,画出监听程序设计流程图)

(2) 页面布局设计图

 (3) 实验源代码(粘贴源代码):

SimpleCalculator.java

 ScienceCalculator.java

BaseConverter.java

DrawFn.java

(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

相关文章

  • JavaWeb课后笔记及体会分享(每日一更)
           从今天开始学习JavaWeb,在接下来的时间里我将学习JavaSE,MySQL,Web前端,JavaEE,SSM三大框架,SpainBoot,SpringCloud,以及一些常见面试题的练习。1.IDEA常用快捷键  Shift两次:包含各种文件、方法的搜索Ctrl+Shift+F:根据输入内容查找整个项目或指定目录内文件......
  • java 反序列化 cc11 复现
    cc11就是对我们调试过的cc3中出口为LazyMap并且没有绕过InvokerTransformer的版本进行修改,使其不出现非javase中的数组.换句话说就是绕过了ChainedTransformer直接来看exppackageorg.example;importcom.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;importco......
  • Java RestTemplate 发送 POST 请求设置请求体示例
    在Java中使用RestTemplate​发送POST请求并设置请求体(body)参数,可以按照以下步骤进行。RestTemplate​是Spring提供的一个用于发送HTTP请求的工具类。示例代码以下是一个完整的示例,展示如何使用RestTemplate​发送POST请求并设置请求体参数:importorg.sp......
  • Java RestTemplate 发送 POST 请求设置请求体示例
    在Java中使用RestTemplate​发送POST请求并设置请求体(body)参数,可以按照以下步骤进行。RestTemplate​是Spring提供的一个用于发送HTTP请求的工具类。示例代码以下是一个完整的示例,展示如何使用RestTemplate​发送POST请求并设置请求体参数:importorg.sp......
  • Java RestTemplate 发送 POST 请求设置请求体示例
    在Java中使用RestTemplate​发送POST请求并设置请求体(body)参数,可以按照以下步骤进行。RestTemplate​是Spring提供的一个用于发送HTTP请求的工具类。示例代码以下是一个完整的示例,展示如何使用RestTemplate​发送POST请求并设置请求体参数:importorg.sp......
  • Java RestTemplate 发送 POST 请求设置请求体示例
    在Java中使用RestTemplate​发送POST请求并设置请求体(body)参数,可以按照以下步骤进行。RestTemplate​是Spring提供的一个用于发送HTTP请求的工具类。示例代码以下是一个完整的示例,展示如何使用RestTemplate​发送POST请求并设置请求体参数:importorg.sp......
  • java面向对象(三)
    static关键字使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类被修饰后的成员具备以下特点:随着类的加载而加载优先于对象存在修饰的成员,被所有对象所共享访问权限允许时,可不创建对象,直接被类调用静态变量使用static修饰的成员变量就是静态变量(或类......
  • java面向对象
    java面向对象1.类和对象1.1类和对象的理解客观存在的事物皆为对象,所以我们也常常说万物皆对象。类类的理解类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型,类是具有相同属性和行为的一组对象的集合简单理解:类就是对现实事物的一种描述类......
  • Java常用类
    一、字符串相关的类1、String类及常用方法String类:代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。String是一个final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。String对象的字符内容是存储在一个......
  • Java RestTemplate 发送 POST 请求设置请求体示例
    在Java中使用RestTemplate​发送POST请求并设置请求体(body)参数,可以按照以下步骤进行。RestTemplate​是Spring提供的一个用于发送HTTP请求的工具类。示例代码以下是一个完整的示例,展示如何使用RestTemplate​发送POST请求并设置请求体参数:importorg.sp......