上课视频:
链接:https://pan.baidu.com/s/15lGZvyxUXtah6qBz-b8D8Q 密码:z2ek
一、布局
image.png
代码:
package com.joychen.mycomputer;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class ComputerWindow extends JFrame {
private JTextField jTextFieldShowView = new JTextField("0"); // 这个是上 面的显示框
private JPanel jPanelCenter = new JPanel(); //中间容器
private JButton jButtonEq = new JButton("="); // 下面的=号button
private JButton jb1, jb2, jb3, jbc, jb4, jb5, jb6, jbAdd, jb7, jb8, jb9, jbd, jb0,
jbPoint, jbChu, jbChen; //16个按钮 在下面的addButton中实例化 并添加到 jPanelCenter容器中去
private MyButtonClick myButtonClick = new MyButtonClick(); //这个是所有按键的 点击事件对象
double num1 = 0; //用于计算的第一个数
double num2 = 0; //用于计算的第二个数
String operation = ""; //记录当前按的操作符 如 + - x /
double result = 0; // 按 = 号后 会进行计算 得到的一结果存在这里
boolean flag = false; // 按了操作符后,再去按数字 会去清空一下 输入框中的内容,这里标记有没有清空过。清空过就不再清空第二次。
public ComputerWindow() throws HeadlessException {
}
public ComputerWindow(String title) throws HeadlessException {
super(title);
setSize(250, 400);
setLocation(200, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗体关闭的同时关闭jvm
setLayout(new BorderLayout());
setResizable(false); //窗口不可以拖动大小
initCompent();
setVisible(true);
}
/**
* 初始化所有组件
*/
private void initCompent() {
jTextFieldShowView.setPreferredSize(new Dimension(250, 40)); //设置 显示框 的宽度
jTextFieldShowView.setHorizontalAlignment(JTextField.RIGHT); // 设置显示框的 字靠右显示
jTextFieldShowView.setColumns(4); //设置显示框 的列数。这里没有太大意义 可写可不写
jTextFieldShowView.setEnabled(false); // 设置 显示框不能用键盘 输入。只能通过代码改变值
add(jTextFieldShowView, BorderLayout.NORTH); //把 显示框添加到根容器的 北边
jPanelCenter.setLayout(new GridLayout(4, 4, 2, 2)); //设置中间容器 为网格布局 4行 4列。
addButton(); //这个函数 会把 上面那16个按钮 添加清台 jPanelCenter 中间容器中,并添加点击事件
add(jPanelCenter, BorderLayout.CENTER); // 把中间容器添加到 根容器的中部
jButtonEq.setPreferredSize(new Dimension(250, 80)); // 设置 =号的 宽高
Font font = new Font("宋体", 40, 40); // 设置字体
jButtonEq.setFont(font); // 把上面的字体对象 设置到 =号按钮对象中
jButtonEq.addMouseListener(myButtonClick); // 给等号 按键添加点击事件
add(jButtonEq, BorderLayout.SOUTH); // 把等号按键 添加到 根容器的 南边
}
private void addButton() {
//初使化按键
jb1 = new JButton("1");
jb2 = new JButton("2");
jb3 = new JButton("3");
jbc = new JButton("C");
jb4 = new JButton("4");
jb5 = new JButton("5");
jb6 = new JButton("6");
jbAdd = new JButton("+");
jb7 = new JButton("7");
jb8 = new JButton("8");
jb9 = new JButton("9");
jbd = new JButton("-");
jb0 = new JButton("0");
jbPoint = new JButton(".");
jbChu = new JButton("/");
jbChen = new JButton("x");
//给按键 注册点击事件
jb1.addMouseListener(myButtonClick);
jb2.addMouseListener(myButtonClick);
jb3.addMouseListener(myButtonClick);
jb4.addMouseListener(myButtonClick);
jb5.addMouseListener(myButtonClick);
jb6.addMouseListener(myButtonClick);
jb7.addMouseListener(myButtonClick);
jb8.addMouseListener(myButtonClick);
jb9.addMouseListener(myButtonClick);
jb0.addMouseListener(myButtonClick);
jbc.addMouseListener(myButtonClick);
jbAdd.addMouseListener(myButtonClick);
jbd.addMouseListener(myButtonClick);
jbChen.addMouseListener(myButtonClick);
jbChu.addMouseListener(myButtonClick);
jbPoint.addMouseListener(myButtonClick);
//把按钮添加到中间容器中
jPanelCenter.add(jb1);
jPanelCenter.add(jb2);
jPanelCenter.add(jb3);
jPanelCenter.add(jbc);
jPanelCenter.add(jb4);
jPanelCenter.add(jb5);
jPanelCenter.add(jb6);
jPanelCenter.add(jbAdd);
jPanelCenter.add(jb7);
jPanelCenter.add(jb8);
jPanelCenter.add(jb9);
jPanelCenter.add(jbd);
jPanelCenter.add(jb0);
jPanelCenter.add(jbPoint);
jPanelCenter.add(jbChu);
jPanelCenter.add(jbChen);
}
//点击事件的操作类
class MyButtonClick implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
String value = ((JButton) e.getComponent()).getText();
if ("C".equals(value)) { //当按添除操作的时候
//清除所有数据
//1.输入框清除,值接是一个0.
jTextFieldShowView.setText("0");
//2.清除所有缓存
num1 = 0;
num2 = 0;
result = 0;
operation = "";
flag = false;
} else if ("+".equals(value)) { //当按+ 操作的时候
String old = jTextFieldShowView.getText();
num1 = Double.parseDouble(old);
num2 = Double.parseDouble(old);
operation = "+";
flag = true;
} else if ("-".equals(value)) {//当按 - 操作的时候
String old = jTextFieldShowView.getText();
num1 = Double.parseDouble(old);
num2 = Double.parseDouble(old);
operation = "-";
flag = true;
} else if ("x".equals(value)) {//当按x 操作的时候
String old = jTextFieldShowView.getText();
num1 = Double.parseDouble(old);
num2 = Double.parseDouble(old);
operation = "x";
flag = true;
} else if ("/".equals(value)) { //当按 / 操作的时候
String old = jTextFieldShowView.getText();
num1 = Double.parseDouble(old);
num2 = Double.parseDouble(old);
operation = "/";
flag = true;
} else if ("=".equals(value)) { //当按 = 操作的时候
if (operation.equals("+")){
result = num1 + num2;
}else if (operation.equals("-")){
result = num1 - num2;
}else if(operation.equals("x")){
result = num1* num2;
}else if (operation.equals("/")){
try {
result = num1 / num2;
}catch (Exception ex){
result = 0;
}
}
jTextFieldShowView.setText(result + "");
num1 = result;
} else if (".".equals(value) ) { //其它的数字
String old = jTextFieldShowView.getText();
if (!old.contains(".")) {
jTextFieldShowView.setText(old + value);
}else{
if (result >0&& operation!=""){
jTextFieldShowView.setText("0.");
}
}
} else if ("0".equals(value) || "0.0".equals(value)) {
} else {
String old = jTextFieldShowView.getText();
if ("0".equals(old) || "0.0".equals(old)) {
jTextFieldShowView.setText(value);
} else if (old.length() >= 15) {
// 控制输入的长度
} else if (!operation.equals("")) { //如果有操作符
if ( flag){
flag = false;
num2 = Double.parseDouble(value);
jTextFieldShowView.setText(value);
}else{
num2 = Double.parseDouble(old + value);
jTextFieldShowView.setText(old + value);
}
} else {
jTextFieldShowView.setText(old + value);
}
}
// JOptionPane.showConfirmDialog(null,((JButton)e.getComponent()).getText());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}