环境: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系统中的默认计算器去写的,主要是细节的实现需要不停的去调试,修改。
由于笔者是在读大数据方向的学生,所以没有深入研究细节,如有不当之处,请各位大佬多多指教