该计算器实现了简单的+-*/运算,而且添加了鼠标监听和键盘监听,练一练布局管理和监听,感觉挺不错的。
可能有bug,有bug请留言我尽量修复
//package 课后练习.GUI.Laout.d3;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.math.BigDecimal;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener{
private JLabel lbNow,lbPre; //显示先前,当前的string
private JButton btns[] = new JButton[19];//按钮
private char btnName[] = {'←','\0','C','/','7','8','9','*',//每个按钮对应的字符
'4','5','6','-','1','2','3','+','0','.','='};
private boolean isFirst = true;//判断是否为用来计算的第一个值
private boolean count = false;//判断是否计算过
private boolean equal = false;//判断是否执行"="按钮
private boolean negative = false;//判断是否为负数
public Calculator() {
super("计算器");
setBounds(200, 100, 250, 350);//设置窗口大小和位置
setDefaultCloseOperation(EXIT_ON_CLOSE);//设置关闭
setResizable(false);//设置窗口不能改变大小
Container contentPane = getContentPane();
contentPane.addKeyListener(new KeyImpl());
JPanel pShow = new JPanel(); //用来显示的面板
pShow.setLayout(new GridLayout(2, 1));//设置网格布局
contentPane.add(pShow,BorderLayout.NORTH);//加在JFrame北部
//显示先前输入的内容的面板
JPanel panelShowPre = new JPanel(new FlowLayout(FlowLayout.RIGHT));
lbPre = new JLabel("");//设置显示内容
lbPre.setLayout(new FlowLayout(FlowLayout.RIGHT));//设置有右对齐
lbPre.setFont(new Font("", Font.PLAIN, 20));//设置字体
lbPre.addKeyListener(new KeyImpl());
panelShowPre.add(lbPre);
panelShowPre.setBackground(Color.white);//设置面板背景颜色
pShow.add(panelShowPre);
//显示当前输入的内容的面板
JPanel panelShowNow = new JPanel(new FlowLayout(FlowLayout.RIGHT));
lbNow = new JLabel("0");
lbNow.setLayout(new FlowLayout(FlowLayout.RIGHT));
lbNow.setFont(new Font("", Font.PLAIN, 30));
lbNow.addKeyListener(new KeyImpl());
panelShowNow.add(lbNow);
panelShowNow.setBackground(Color.white);
pShow.add(panelShowNow);
//放置普通按钮的面板
JPanel panelBtn = new JPanel(new GridLayout(4, 4));
setButton(panelBtn);//调用设置普通按钮的函数
//放置特殊按钮的面板
JPanel panelBtn2 = new JPanel(new GridLayout(1, 2));
contentPane.add(panelBtn2,BorderLayout.SOUTH);
btns[16] = new JButton(btnName[16]+"");
btns[16].setFont(new Font("", Font.BOLD, 30));
btns[16].addActionListener(this);
btns[16].addKeyListener(new KeyImpl());
panelBtn2.add(btns[16]);
JPanel panelBtn2_2 = new JPanel(new GridLayout(1, 2));
btns[17] = new JButton(btnName[17]+"");
btns[17].setFont(new Font("", Font.BOLD, 30));
btns[17].addActionListener(this);
btns[17].addKeyListener(new KeyImpl());
panelBtn2_2.add(btns[17]);
btns[18] = new JButton(btnName[18]+"");
btns[18].setFont(new Font("", Font.BOLD, 30));
btns[18].addActionListener(this);
btns[18].addKeyListener(new KeyImpl());
panelBtn2_2.add(btns[18]);
panelBtn2.add(panelBtn2_2);
contentPane.add(panelBtn,BorderLayout.CENTER);
setVisible(true);
}
//用来布置按钮位置的函数
public void setButton(JPanel p){
for (int i = 0; i < 16; i++) {
btns[i] = new JButton();
btns[i].setText(btnName[i]+"");
btns[i].setFont(new Font("", Font.BOLD, 30));
btns[i].addActionListener(this);
btns[i].addKeyListener(new KeyImpl());
p.add(btns[i]);
}
btns[0].setFont(new Font("", Font.BOLD, 25));
btns[1].setFont(new Font("", Font.BOLD, 15));
btns[1].setText("CE");
}
//实现鼠标点击各个部件的监听
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==btns[0]) {
achieveDelete();
}
if (e.getSource()==btns[1]) {
lbNow.setText("0");
}
if (e.getSource()==btns[2]) {
lbNow.setText("0");
lbPre.setText("");
isFirst = true;
count = false;
equal = false;
}
if (e.getSource()==btns[3]) {
countAndShow('/');
}
if (e.getSource()==btns[7]) {
countAndShow('*');
}
if (e.getSource()==btns[11]) {
countAndShow('-');
}
if (e.getSource()==btns[15]) {
countAndShow('+');
}
//‘=’比较特殊单独实现
if (e.getSource()==btns[18]) {
achieveEqual();
}
if (e.getSource()==btns[17]) {
lbNow.setText(lbNow.getText()+".");
}
if (e.getSource()==btns[4]) {
numberShow(7);
}
if (e.getSource()==btns[5]) {
numberShow(8);
}
if (e.getSource()==btns[6]) {
numberShow(9);
}
if (e.getSource()==btns[8]) {
numberShow(4);
}
if (e.getSource()==btns[9]) {
numberShow(5);
}
if (e.getSource()==btns[10]) {
numberShow(6);
}
if (e.getSource()==btns[12]) {
numberShow(1);
}
if (e.getSource()==btns[13]) {
numberShow(2);
}
if (e.getSource()==btns[14]) {
numberShow(3);
}
if (e.getSource()==btns[16]) {
numberShow(0);
}
}
//用来计算的函数
public void count(){
String preStr = lbPre.getText();
char c = preStr.charAt(preStr.length()-1);
double pre = 0;
double now = 0;
try {
BigDecimal p = new BigDecimal((String) preStr.subSequence(0, preStr.length()-1));
pre = p.doubleValue();
BigDecimal n = new BigDecimal(lbNow.getText());
now = n.doubleValue();
//pre = Double.parseDouble((String) preStr.subSequence(0, preStr.length()-1));
//now = Double.parseDouble(nowLb.getText());
} catch (NumberFormatException e) {
}
switch (c) {
case '+':
pre += now;
break;
case '-':
pre -= now;
break;
case '*':
pre *= now;
break;
case '/':
if (now==0) {
lbPre.setText("除数不能为0 ");
equal = true;
return;
}
pre /= now;
break;
default:
}
lbPre.setText(pre+""+c);
}
//实现各个数字显示
public void numberShow(int i){
if (equal) {
lbPre.setText(" ");
}
if (isFirst) {
lbNow.setText("");
isFirst = false;
count = false;
}
if (negative) {
lbNow.setText("-");
negative = false;
}
if (lbNow.getText().equals("0")) {
lbNow.setText(i+"");
System.out.println(1);
}else {
lbNow.setText(lbNow.getText()+i);
System.out.println(2);
}
}
//实现计算功能并显示
public void countAndShow(char c){
if (isFirst && c == '-'&&lbPre.getText().equals("")) {
lbNow.setText("-");
negative = true;
}
equal =false;
if (lbPre.getText().length()>1&&!isFirst) {
count();
count = true;
}else if(!isFirst){
lbPre.setText(lbNow.getText()+c);
}
if (count) {
lbPre.setText((String) lbPre.getText().subSequence(0, lbPre.getText().length()-1)+c);
}
isFirst = true;
}
//实现‘=’功能
public void achieveEqual(){
if (lbPre.getText().length()>1&&!isFirst) {
count();
count = true;
}else if(!isFirst){
lbPre.setText(lbNow.getText());
}
if (count) {
lbPre.setText((String) lbPre.getText().subSequence(0, lbPre.getText().length()-1)+" ");
equal = true;
}
isFirst = true;
}
//实现删除功能
public void achieveDelete(){
if (!lbNow.getText().equals("0")&&lbNow.getText().length()>0) {
lbNow.setText(" "+(String) lbNow.getText().subSequence(0, lbNow.getText().length()-1));
}
}
//主函数
public static void main(String[] args) {
new Calculator();
}
//实现键盘监听各个部位
class KeyImpl extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch (keyCode) {
case 96:
numberShow(0);
break;
case 97:
numberShow(1);
break;
case 98:
numberShow(2);
break;
case 99:
numberShow(3);
break;
case 100:
numberShow(4);
break;
case 101:
numberShow(5);
break;
case 102:
numberShow(6);
break;
case 103:
numberShow(7);
break;
case 104:
numberShow(8);
break;
case 105:
numberShow(9);
break;
case 110:
lbNow.setText(lbNow.getText()+".");
break;
case 107:
countAndShow('+');
break;
case 109:
countAndShow('-');
break;
case 106:
countAndShow('*');
break;
case 111:
countAndShow('/');
break;
case 10:
achieveEqual();
break;
case 8:
achieveDelete();
break;
}
}
}
}