Swing 开发计算器

环境:eclipse
jdk版本:1.8+
ps:如果您想读懂这篇博客,并有所收获的话,最好是有swing开发的基础知识

这篇文章适合刚刚学完Java swing而又没有实战经验的人

这是效果图:
效果图
整体的框架还是十分规范的MyFrame和SwingDemo,分成demo的部分和frame框架。

SwingDemo.java

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class SwingDemo {
	public static void CreateGUI() {
		JFrame frame = new MyFrame("计算器");
		
		int width = 460;
		int height = 570;
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(width,height);
		
		//居中显示
		Dimension pos = Toolkit.getDefaultToolkit().getScreenSize();
		int s_width = pos.width;
		int s_height = pos.height;
		int x = (s_width - width) / 2;
		int y = (s_height - height) / 2;
		frame.setLocation(new Point(x,y));
		frame.setVisible(true);
		
	}
	
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(()->{
			CreateGUI();
		});
	}
}
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import af.swing.AfPanel;
import myLayout.AfXLayout;
import myLayout.AfYLayout;

public class MyFrame extends JFrame{
	/*
	 * 控件的声明
	 */
	
	JLabel label1; 
	
	JLabel label2; //显示数字
	
	String op; //记录符号
	
	boolean op_flag = false;//记录是否按下了符号键
	
	boolean equ_flag = false; //记录是否按下了等号
	
	/*
	 * frame布局
	 */
	public MyFrame(String title) {
		super(title);
		
		Container root = getContentPane();
		root.setLayout(new AfYLayout(5));
		
		//显示panel
		if (true) {
			AfPanel panel = new AfPanel();
			
			panel.setLayout(new AfYLayout(0));
			panel.padding(15,0,0,8);
			panel.setOpaque(true);
			panel.setBackground(Color.white);
			
			label1 = new JLabel("ready");
			label1.setForeground(Color.gray);
			label1.setHorizontalAlignment(SwingConstants.RIGHT);
			label1.setFont(new Font("微软雅黑",Font.PLAIN,30));
			
			label2 = new JLabel("0");
			label2.setHorizontalAlignment(SwingConstants.RIGHT);
			label2.setFont(new Font("微软雅黑",Font.BOLD,80));
			
			panel.add(label1,"30%");
			panel.add(label2,"1w");
			
			root.add(panel,"180px");
			
		}
		
		//按钮
		if (true) {
			AfPanel  panel = new AfPanel();
			panel.setLayout(new AfXLayout(7));
			
			JButton btn_ce = CreateSymbolButton("CE");
			JButton btn_c = CreateSymbolButton("C");
			JButton btn_back = CreateSymbolButton(getClass().getResource("/icon/backspace.png"));
			JButton btn_div = CreateSymbolButton("/");
			
			btn_ce.addActionListener(new MySymbolListener("ce"));
			btn_c.addActionListener(new MySymbolListener("c"));
			btn_back.addActionListener(new MySymbolListener("back"));
			btn_div.addActionListener(new MySymbolListener("/"));
			
			panel.add(btn_ce,"25%");
			panel.add(btn_c,"25%");
			panel.add(btn_back,"25%");
			panel.add(btn_div,"25%");
			
			root.add(panel,"60px");
		}
		
		if (true) {
			AfPanel  panel = new AfPanel();
			panel.setLayout(new AfXLayout(7));
			
			JButton btn_ce = CreateNumberButton(7);
			JButton btn_c = CreateNumberButton(8);
			JButton btn_back = CreateNumberButton(9);
			JButton btn_mul = CreateSymbolButton("x");
			
			btn_mul.addActionListener(new MySymbolListener("x"));
			
			panel.add(btn_ce,"25%");
			panel.add(btn_c,"25%");
			panel.add(btn_back,"25%");
			panel.add(btn_mul,"25%");
			
			root.add(panel,"60px");
		}
		if (true) {
			AfPanel  panel = new AfPanel();
			panel.setLayout(new AfXLayout(7));
			
			JButton btn_ce = CreateNumberButton(4);
			JButton btn_c = CreateNumberButton(5);
			JButton btn_back = CreateNumberButton(6);
			JButton btn_minu = CreateSymbolButton("-");
			
			btn_minu.addActionListener(new MySymbolListener("-"));
			
			panel.add(btn_ce,"25%");
			panel.add(btn_c,"25%");
			panel.add(btn_back,"25%");
			panel.add(btn_minu,"25%");
			
			root.add(panel,"60px");
		}
		if (true) {
			AfPanel  panel = new AfPanel();
			panel.setLayout(new AfXLayout(7));
			
			JButton btn_ce = CreateNumberButton(1);
			JButton btn_c = CreateNumberButton(2);
			JButton btn_back = CreateNumberButton(3);
			JButton btn_add = CreateSymbolButton("+");
			
			btn_add.addActionListener(new MySymbolListener("+"));
			
			panel.add(btn_ce,"25%");
			panel.add(btn_c,"25%");
			panel.add(btn_back,"25%");
			panel.add(btn_add,"25%");
			
			root.add(panel,"60px");
		}
		
		if (true) {
			AfPanel  panel = new AfPanel();
			panel.setLayout(new AfXLayout(7));
			
			JButton btn_ce = CreateSymbolButton("-/+");
			JButton btn_c = CreateNumberButton(0);
			JButton btn_dot = CreateSymbolButton(".");
			JButton btn_equ = CreateSymbolButton("=");
			
			btn_dot.addActionListener(new MySymbolListener("."));
			btn_equ.addActionListener(new MySymbolListener("="));
			
			panel.add(btn_ce,"25%");
			panel.add(btn_c,"25%");
			panel.add(btn_dot,"25%");
			panel.add(btn_equ,"25%");
			
			root.add(panel,"60px");
		}
		
	}
	
	public JButton CreateSymbolButton(String str) {
		JButton btn = new JButton(str);
		btn.setFont(new Font("宋体",Font.PLAIN,20));
		btn.setFocusPainted(false);
		//设置点击事件
		btn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				
			}
		});
		return btn;
	}
	
	
	public JButton CreateSymbolButton(URL url) {
		Icon icon = new ImageIcon(url);
		JButton button = new JButton();
		button.setIcon(icon);
		button.setFocusPainted(false);
		return button;
	}
	
	public JButton CreateNumberButton(Integer n) {
		JButton btn = new JButton(n.toString());
		btn.setOpaque(true);
		btn.setBackground(Color.white);		
		btn.setFocusPainted(false);
		btn.setFont(new Font("宋体",Font.PLAIN,20));
		btn.addActionListener(new MyNumberListener(n));
		return btn;
	}
	
	public class MySymbolListener implements ActionListener {
		String cmd;
		public MySymbolListener(String cmd) {
			this.cmd = cmd;
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			
			String str = label2.getText();
			
			if (cmd.compareTo("ce") == 0 ) {
				label2.setText("0");
				label1.setText("ready");
				op_flag = false;
				equ_flag = false;
			} else if (cmd.compareTo("c") == 0) {
				label2.setText("0");
			}
			else if (cmd.compareTo("back") == 0) {
				if (str.length() != 1) {
					String new_str = str.substring(0, str.length() - 1);
					label2.setText(new_str);
				}
				else if (str.length() == 1) {
					label2.setText("0");
				}
			}
			else if (cmd.compareTo(".") == 0) {
				if ((str.length() - str.replace(".", "").length()) == 0) {
					str += ".";
					label2.setText(str);
				}
			}
			else if (cmd.compareTo("+") == 0 || cmd.compareTo("-") == 0 || cmd.compareTo("/") == 0 || cmd.compareTo("x") == 0) {
				op = cmd;
				label1.setText(str + cmd);
				op_flag = true;
			}
			else if (cmd.compareTo("=") == 0) {
				
				Double num1 = Double.parseDouble(label1.getText().substring(0, label1.getText().length() - 1));
				Double num2 = Double.parseDouble(label2.getText());
				equ_flag = true;
				Double res = 0.0;
				if (op.compareTo("+") == 0 ) {
					//如果是加法
					res = num1 + num2;
				} else if (op.compareTo("-") == 0) {
					res = num1 - num2;
				} else if (op.compareTo("x") == 0) {
					res = num1 * num2;
				} else if (op.compareTo("/") == 0) {
					res = num1 / num2;
				}
				String str_res = res.toString();
				str_res = trim(str_res);
				label1.setText("ready");
				label2.setText(str_res);
		
			}

		}
	}
	
	//数字按键的触发器
	public class MyNumberListener implements ActionListener {
		
		Integer num;
		public MyNumberListener(Integer num) {
			this.num = num;
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if (op_flag == true) {
				label2.setText("0");
				op_flag = false;
			}
			if (equ_flag == true) {
				label2.setText("0");
				equ_flag = false;
			}
			
			String str = label2.getText();
			
			if (str.compareTo("0") == 0) {
				//如果是0
				str = num.toString();
				label2.setText(str);
			}
			else {
				str += num.toString();
				
				label2.setText(str);
			}
		}
	}
	
	//去除double变量后面的多余的0
	public String trim(String num) {
		String str = num;
		char[] array = str.toCharArray();
		int len = array.length;
		for (int i = len - 1;i > 0; i --) {
			if (array[i] == '0') {
				array[i] = '\0';
			}
			else if (array[i] != '0') {
				break;
			}
		}
		
		array = new String(array).replaceAll("\0", "").toCharArray();
		len = array.length;
		if (array[len - 1] == '.') {
			array[len - 1] = '\0';
		}
	
		return new String(array).replaceAll("\0", "");
	}
}

总结:
这个项目整体的难度不大,因为界面设计十分简单,而且功能是可以仿照windows系统中的默认计算器去写的,主要是细节的实现需要不停的去调试,修改。

由于笔者是在读大数据方向的学生,所以没有深入研究细节,如有不当之处,请各位大佬多多指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值