这是我发的第一个博客,也是我用Java写的第一个图形程序,它能进行简单的四则运算、开跟、倒数。
package com.UI.JavaUITest;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator02 extends JPanel {
private JTextField display; //显示器
private JPanel jPanel; //容器
private double result; //数据存储
private String lastCommand; //特殊命令
private boolean isStart; //执行条件
// 构造函数
public Calculator02() {
setLayout(new BorderLayout()); //整个窗口布局为BroderLayout()
result = 0;
lastCommand = "=";
isStart = true;
display = new JTextField("0"); //建立一个显示器
display.setEnabled(false); //禁止用户输入,副作用是字体颜色变为浅灰色,可以考虑用按钮来当显示器,但按钮当显示器字体会居中显示,不符合习惯
display.setFont(new Font("微软雅黑", Font.BOLD, 20)); //设置显示器中字体格式
add(display, BorderLayout.NORTH); //将显示器放置窗口顶部
ActionListener insert = new InsertAction(); //数字按钮的事件处理机制对象
ActionListener command = new CommandAction(); //特殊按钮的事件处理机制对象
jPanel = new JPanel(new GridLayout(5, 4));//建立一个5行4列的容器,存放按钮
// 定义一个addButton方法,用于设置、添加按钮
addButton("C", command);
addButton("CE", command);
addButton("sqrt", command);
addButton("1/x", command);
addButton("7", insert);
addButton("8", insert);
addButton("9", insert);
addButton("/", command);
addButton("4", insert);
addButton("5", insert);
addButton("6", insert);
addButton("*", command);
addButton("1", insert);
addButton("2", insert);
addButton("3", insert);
addButton("-", command);
addButton("0", insert);
addButton(".", insert);
addButton("=", command);
addButton("+", command);
add(jPanel, BorderLayout.CENTER);//将容器放置窗口中央
}
// 添加、设置按钮的方法
public void addButton(String name, ActionListener listener) {
JButton jButton = new JButton(name);
jButton.addActionListener(listener); //实现按钮的事件处理
jButton.setFont(new Font("微软雅黑", Font.PLAIN, 20)); //设置按钮的字体格式
jPanel.add(jButton);//在容器中添加按钮
}
// 数字按钮的事件处理,设置为内部私有类,防止其他类的非法访问
private class InsertAction implements ActionListener {
public void actionPerformed(ActionEvent event) {
String input = event.getActionCommand(); //接收按钮信息
// 建立异常处理机制,防止用户非法输入导致的程序崩溃
try {
// 判断数字输入是否为第一次,是则清空显示屏,输出按钮信息
if (isStart) {
display.setText("");
isStart = false;
}
display.setText(display.getText() + input); //将数据连接起来显示在显示屏上
}catch (NumberFormatException e) { //捕捉数字格式化异常,重置所有计算变量
display.setText("error");
result = 0;
lastCommand = "=";
isStart = true;
}catch (ArithmeticException e){ //捕捉算数异常,重置所有计算变量
display.setText("error");
result = 0;
lastCommand = "=";
isStart = true;
}
}
}
// 特殊按钮的事件处理机制,设置为内部私有类,防止其他类的非法访问
private class CommandAction implements ActionListener{
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand(); //接收按钮信息
// 建立异常处理机制,防止用户非法输入导致的程序崩溃
try {
// 添加“C”的清除当前数据功能
if (command.equals("C")) {
display.setText("0");
isStart = true;
}
// 添加“CE”的清除所有数据功能,重新初始化所有计算变量
else if (command.equals("CE")) {
display.setText("0");
result = 0;
lastCommand = "=";
isStart = true;
}
// 判断首次输入是否为“-”,是则为负数
else if (isStart) {
if (command.equals("-")) {
display.setText("-");
isStart = false;
}
else lastCommand = command;
}
else{
// 定义calculatorDemo方法,用于计算数值
calculatorDemo(Long.parseLong(display.getText()));//将在显示屏中显示的字符串转换为Long类型
lastCommand = command;
isStart = true;
}
}catch (NumberFormatException e){ //捕捉数字格式化异常
display.setText("error");
result = 0;
lastCommand = "=";
isStart = true;
}catch (ArithmeticException e){ //捕捉算数异常
display.setText("error");
result = 0;
lastCommand = "=";
isStart = true;
}
}
}
// 计算方法
public void calculatorDemo(double num){
// 因为break语法的不稳定性较高,在设计程序的时候,因尽量避免使用switch语法,所以在这里使用if语句代替switch,增加程序的稳定性
if (lastCommand.equals("+")) result += num;
else if (lastCommand.equals("-")) result -= num;
else if (lastCommand.equals("*")) result *= num;
else if (lastCommand.equals("/")) result /= num;
else if (lastCommand.equals("=")) result = num;
else if (lastCommand.equals("sqrt")) result = Math.sqrt(num);
else if (lastCommand.equals("1/x")) result = 1 / num;
display.setText("" + result);
}
public static void main(String[] args) {
JFrame jFrame = new JFrame("计算器"); //创建窗口
JPanel jPanel2 = new Calculator02();
jFrame.setContentPane(jPanel2);//窗口中的容器可见
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口即关闭程序
jFrame.pack();
jFrame.setLocationRelativeTo(jPanel2); //窗口出现在屏幕中央
jFrame.setVisible(true); //窗口可见
}
}