Java实现图形界面计算器(简易版)

        经过一个月的Java学习,听说Java中的第一个小型程序好多都做的是计算器,今天我也来做做吧,把这一个月学习的知识简单的综合一下,熟练近期学习的知识点。

        我做的计算器如下图:

功能:对实数进行加、减、乘、除、余操作。

界面设置:首先设置一个窗体,一个菜单条,三个菜单项(无功能),三个标签(作为显示数据的地方,第一个标签作为提示作用,第二个标签作为输入数据作用,第三个标签显示结果作用),20个按钮(循环进行添加),两个面板(把三个标签添加到第一个面板里,把20个按钮添加到第二个面板里,用网格布局,这样做不易位置错乱),再把两个面板添加到窗体中就OK了。

下面是完整代码,在一个类中,注释非常详细。

package day7_29;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

public class Caculate {
	// 对计算器整体框架的建立
	private JFrame frame = new JFrame("&斌的图形界面计算器&");// 创建窗体对象
	private JMenuBar menubar = new JMenuBar(); // 创建菜单条对象
	private JMenu menu1 = new JMenu("查看"); // 创建菜单对象1
	private JMenu menu2 = new JMenu("编辑"); // 创建菜单对象2
	private JMenu menu3 = new JMenu("帮助"); // 创建菜单对象3
	private JLabel label_hint = new JLabel(); // 创建提示信息标签
	private JLabel label_input = new JLabel(); // 创建输入信息标签
	private JLabel label_result = new JLabel(); // 创建输出结果标签3
	private JPanel panel_show = new JPanel(); // 创建显示面板
	private JPanel panel_operation = new JPanel(); // 创建按键面板

	private String[] str = { "AC", "←", "(-)", "+", "7", "8", "9", "-", "4", "5", "6", "*", "1", "2", "3", "÷", "%",
			"0", ".", "=" }; // 计算器的按键从上到下、从左到右顺序表示
	private JButton[] button = new JButton[str.length]; // 创建计算器的按键对象
	private double result = 0; // 存储计算结果
	private boolean flag = true; //
	private boolean find = true; 
	private String command = "=";

	public static void main(String[] args) {// 主方法
		new Caculate().initJFrame();
	}

	// 对界面进行初始化
	public void initJFrame() {
		Container con = frame.getContentPane();
		con.setBackground(Color.green); // 设置颜色
		// 设置窗体位置及大小(下面一段代码实现居中)
		frame.setSize(600, 550); 
		//方法一
//		Toolkit toolKit = Toolkit.getDefaultToolkit(); // 获取默认工具包
//		Dimension dimension = toolKit.getScreenSize(); // 获取屏幕对象
//		double screenWidth = dimension.getWidth(); // 获取屏幕的宽和高
//		double screenHight = dimension.getHeight();
//		int jframeWidth = frame.getWidth(); // 获取窗体的宽和高
//		int jframeHight = frame.getHeight();
//		int x = (int) ((screenWidth - jframeWidth) / 2); // 得到窗体真正位置
//		int y = (int) ((screenHight - jframeHight) / 2);
//		frame.setLocation(x, y); // 设置窗体居中
		//方法二
		frame.setLocationRelativeTo(null);//设置窗口相对于指定组件的位置。如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央。

		menubar.add(menu1);// 把菜单添加到菜单条中
		menubar.add(menu2);
		menubar.add(menu3);
		menu1.setFont(new Font("", Font.BOLD, 20));// 设置菜单字体样式
		menu2.setFont(new Font("", Font.BOLD, 20));
		menu3.setFont(new Font("", Font.BOLD, 20));
		frame.setJMenuBar(menubar);// 把菜单添加到菜单条中

		label_hint.setText(" "); // 标签内容初始化为空
		label_hint.setHorizontalAlignment(JLabel.RIGHT); // 设置图标和文本的水平对齐方式为右对齐
		label_hint.setFont(new Font("宋体", Font.BOLD, 30));// 设置此标签的字体。
		label_hint.setForeground(Color.RED); // 设置字体颜色为红色

		label_input.setText(" "); // 标签内容初始化为空
		label_input.setHorizontalAlignment(JLabel.RIGHT); // 设置图标和文本的水平对齐方式为右对齐
		label_input.setFont(new Font("宋体", Font.BOLD, 30));// 设置此标签的字体。
		label_input.setForeground(Color.BLACK); // 设置字体颜色为黑色

		label_result.setText("0");// 标签内容初始化内容为0
		label_result.setHorizontalAlignment(JLabel.RIGHT); // 设置图标和文本的水平对齐方式为右对齐
		label_result.setFont(new Font("宋体", Font.BOLD, 35));// 设置此标签的字体。
		label_result.setForeground(Color.BLUE); // 设置字体颜色为蓝色

		panel_show.setLayout(new BorderLayout()); // 设置为边界布局
		panel_show.add(label_hint, BorderLayout.NORTH); // 把错误提示标签放在上面
		panel_show.add(label_input, BorderLayout.CENTER);// 把输入信息标签放在中间
		panel_show.add(label_result, BorderLayout.SOUTH);// 把输出结果标签放在下面
		// 创建具有指定类型、高亮显示和阴影颜色的斜面边框。
		panel_show.setBorder(
				new BevelBorder(BevelBorder.RAISED, new Color(160, 170, 180), null, SystemColor.scrollbar, null));
		panel_operation.setLayout(new GridLayout(5, 4, 8, 8));// 按键设置为网格布局5行5列间距为8
		// 创建具有指定类型、高亮显示和阴影颜色的斜面边框。凸出斜面类型。为滚动条提供的背景色。
		panel_operation.setBorder(
				new BevelBorder(BevelBorder.RAISED, new Color(160, 170, 180), null, SystemColor.scrollbar, null));
		// 添加按钮
		for (int i = 0; i < str.length; i++) {
			button[i] = new JButton(str[i]);
			button[i].setFont(new Font("宋体", Font.BOLD, 30)); // 设置按钮中字体样式
			if (str[i].equals("+") || str[i].equals("-") || str[i].equals("*") || str[i].equals("÷")
					|| str[i].equals("%") || str[i].equals("=")) {
				button[i].addActionListener(new OperationListener());// 给按钮+,-,*,/,%,=注册监听器
			} else {
				button[i].addActionListener(new DataListener());//给按钮AC,←,(-),.,0,1,2,3,4,5,6,7,8,9注册监听器
			}

			panel_operation.add(button[i]);// 把每个按钮分别添加到面板上
		}
		// 把面板添加到窗体框架里
		frame.add(panel_operation, BorderLayout.CENTER);
		frame.add(panel_show, BorderLayout.NORTH);
		//frame.setResizable(false); // 设置窗体不能改变大小
		frame.setVisible(true); // 设置窗体可见
		frame.setDefaultCloseOperation(frame.DISPOSE_ON_CLOSE);// 释放窗口
	}
	
	public class DataListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String str = e.getActionCommand();//返回与此动作相关的命令字符串。
			if (Caculate.this.flag == true) {//当想输入新的数字时,清空输入显示标签
				label_input.setText(" ");
				Caculate.this.flag = false;

			}
			if (str.equals("(-)")) {//当点击(-)时
				if (label_input.getText().indexOf("(-)") == -1) {//如果此时显示框里还没出现(-)时
					label_input.setText(str);
				}
			}
			if (!str.equals("(-)")) {//当命令不是(-)时
				if (str.equals("AC")) { //点击清零键时
					clear();
				} else if (str.equals("←")) { //点击返回键时
					getBack();
				} else if (str.equals(".")) { // 点击小数点时,小数点只能出现一次,不能在首位
					if (label_input.getText().indexOf(".") == -1 && !label_input.getText().equals(" ")) {
						label_input.setText(label_input.getText() + str);
					} else {
						//clear();
						label_input.setText(label_input.getText() + str);
						label_hint.setText("小数点不合法,请重新输入");
					}
				} else { //点击0,1,2,3,4,5,6,7,8,9时显示原数
					label_input.setText(label_input.getText() + str);
				}
			}
		}
	}

	// 返回上一级
	public void getBack() {
		if (label_input.getText().length() <= 1) { //长度小于等于1时清空显示框
			clear();
		} else {
			String str = "";
			if (label_input.getText().length() == 3) { //处理(-)问题,我把(-)看成算一个字符,要返回就整体返回
				String str1 = label_input.getText().substring(label_input.getText().length() - 3);
				if (str1.equals("(-)")) {
					str = " ";
				} else {
					str = label_input.getText().substring(0, label_input.getText().length() - 1);
				}
			} else { //长度大于3时正常返回上一级
				str = label_input.getText().substring(0, label_input.getText().length() - 1);
			}
			label_input.setText(str); //设置输入显示框为str
		}
		label_hint.setText(" "); //清空提示显示框
	}

	// 清屏
	public void clear() {
		label_hint.setText(" ");
		label_input.setText(" ");
		label_result.setText("0");
		this.result = 0;
		Caculate.this.flag = true; //恢复初始化标记
		Caculate.this.find = true; //恢复初始化标记
	}

	public class OperationListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String str = e.getActionCommand(); // 返回与此动作相关的命令字符串
			if (Caculate.this.flag == false) { //当第一次点击+,-,*,、,%,=时
				if (label_input.getText().contains("(-)")) { //把(-)处理为-,然后在进行数据操作
					label_input.setText(label_input.getText().replaceAll("\\(-\\)", "-"));
				}

				caculate(Double.parseDouble(label_input.getText())); //计算
				Caculate.this.flag = true; //把flag标记处理点击多次操作运算符和输入下一个数的情况
				Caculate.this.command = str; //供下一次数据运算操作命令
			} else { //多次点击+,-,*,/,%,=时
				Caculate.this.command = str;
				if (str == "%" && Caculate.this.find == true) { //处理刚开始输入显示框为空时对0取余的情况
					Caculate.this.find = false; //把find标记
					Caculate.this.command = "=";
				}
			}
		}
	}
	//进行数据运算
	public void caculate(double ans) {
		switch (this.command) {
		case "+": //计算数据的和
			this.result += ans;
			break;
		case "-": //计算数据的差
			this.result -= ans;
			break;
		case "*": //计算数据的乘积
			this.result *= ans;
			break;
		case "÷": //计算数据的商
			if (ans == 0) {
				label_hint.setText("提示:除数不能为0");
				return;
			}
			this.result /= ans;
			break;
		case "%": //计算数据的余
			double s1 = this.result;
			int d1 = (int) s1;
			double s2 = ans;
			int d2 = (int) s2;
			if (d1 == this.result && d2 == ans && d2 != 0) {
				this.result %= ans;
			} else {
				if (d1 != s1) {
					label_hint.setText("提示:余数的分子必须为整数");
				}
				else if (d2 != s2) {
					label_hint.setText("提示:余数的分母必须为整数");
				}
				else if (s2 == 0) {
					label_hint.setText("提示:余数的分母不能为0");
				}
			}
			break;
		case "=": //计算结果
			this.result = ans;
			break;
		}
		label_result.setText(" " + format(this.result)); //显示计算结果
	}
	//计算结果格式处理
	public String format(double d) {
		String formatString = "";
		NumberFormat nf = NumberFormat.getInstance(); // 放回当前默认语言环境的通用数字格式
		formatString = nf.format(d); // 格式规范化
		return formatString; //返回格式化后的数据
	}
}

 

  • 72
    点赞
  • 386
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,关于图形化界面计算器,你需要使用Java Swing库来创建用户界面,以及Java的基本数学库来进行计算。以下是一个简单的Java图形化界面计算器的示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calculator extends JFrame implements ActionListener { private JPanel panel; private JTextField textField; private JButton[] buttons; private String[] buttonLabels = {"7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"}; private double num1 = 0, num2 = 0; private String operator = ""; public Calculator() { setTitle("Java Calculator"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); panel = new JPanel(); panel.setLayout(new GridLayout(4, 4)); textField = new JTextField(); textField.setHorizontalAlignment(JTextField.RIGHT); textField.setEditable(false); buttons = new JButton[buttonLabels.length]; for (int i = 0; i < buttonLabels.length; i++) { buttons[i] = new JButton(buttonLabels[i]); buttons[i].addActionListener(this); panel.add(buttons[i]); } add(textField, BorderLayout.NORTH); add(panel, BorderLayout.CENTER); setVisible(true); } public void actionPerformed(ActionEvent e) { String buttonLabel = e.getActionCommand(); if (buttonLabel.matches("[0-9.]")) { if (operator.equals("")) { num1 = Double.parseDouble(textField.getText() + buttonLabel); textField.setText(Double.toString(num1)); } else { num2 = Double.parseDouble(textField.getText() + buttonLabel); textField.setText(Double.toString(num2)); } } switch (buttonLabel) { case "+": case "-": case "*": case "/": operator = buttonLabel; break; case "=": calculate(); break; default: break; } } private void calculate() { switch (operator) { case "+": textField.setText(Double.toString(num1 + num2)); break; case "-": textField.setText(Double.toString(num1 - num2)); break; case "*": textField.setText(Double.toString(num1 * num2)); break; case "/": textField.setText(Double.toString(num1 / num2)); break; default: break; } num1 = Double.parseDouble(textField.getText()); num2 = 0; operator = ""; } public static void main(String[] args) { new Calculator(); } } ``` 这个计算器使用了Java Swing库创建了一个简单的用户界面。它包括一个文本框和一个包含数字和运算符按钮的面板。当用户点击数字或运算符按钮时,它将根据当前操作符将数字存储在一个变量中,并在文本框中显示它们。当用户点击等号按钮时,它将使用存储的数字和操作符计算结果,并将结果显示在文本框中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值