[实验目的]
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
[实验内容]
1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
[实验要求]
1.选择合适的集成开发环境和工具完成计算器软件的开发
2.将开发好软件进行测试并截图
3.将本次实验过程写成实验报告提交在本次作业的链接中
4.关键代码部分以代码块格式粘贴在实验报告正文中
1:创建一个类UserUI
2:在类中创建一个方法initUI()
2.1: 创建一个窗体对象 JFrame jf=new JFrame(\"用户入口界面\");
2.2: 设置窗体相关属性:
2.2.1: 设置窗体大小: jf.setSize(400, 400);
2.2.2: 设置窗体位置: jf.setLocation(300, 200);
2.2.3: 设置窗体关闭方式: jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
2.2.4: 设置窗体不可改变大小: jf.setResizable(false);
2.2.5: 设置窗体内的布局方式为流式布局: jf.setLayout(new FlowLayout());
2.2.6: 设置窗体可视化: jf.setVisible(true);
2.3: 创建组件对象:图标、图标标签、账号标签、账号输入框、密码标签、密码文本输入框、登录按钮、注册按钮
2.3.1: 创建图标对象: ImageIcon icon=new ImageIcon(\"src/login/111.png\");
2.3.2: 创建图标标签对象: JLabel iconLabel=new JLabel(icon);
2.3.3: 创建账号标签对象: JLabel accountLabel=new JLabel(\"账号:\");
2.3.4: 创建账号输入框对象: JTextField accountField=new JTextField(33);
2.3.5: 创建密码标签对象: JLabel passwordLabel=new JLabel(\"密码:\")
2.3.6: 创建密码输入框对象: JPasswordField passwordField=new JPasswordField(33);
2.3.7: 创建登录按钮对象: JButton loginButton=new JButton(\"登录\");
2.3.8: 创建注册按钮对象: JButton registerButton=new JButton(\"注册\");
2.4: 组件创建完成后,通过 jf.add (); 语句添加组件
jf.add (imgjla);
jf.add (accountjla);
jf.add (accountjtf);
jf.add (passwordjla);
jf.add (passwordjpf);
jf.add (loginjbt);
jf.add (registjbt);
3: 在类中创建一个主函数,创建UserUI对象,调用initUI()方法
代码如下:
package login;
import java.awt.*;
import javax.swing.*;
public class UserUI {
public void initUI(){
System.out.println ("UserUI");
//界面
JFrame jf = new JFrame ("用户界面");
jf.setSize (400, 400);//窗体大小
jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);//窗体关闭方式
jf.setLocationRelativeTo (null);// 居中
jf.setLayout (new FlowLayout ());
// 创建组件对象
//在界面中显示一张图片:
ImageIcon imgIcon = new ImageIcon ("src/login/111.png");//图标对象
JLabel imgjla = new JLabel (imgIcon);//把图片显示在一个标签里面
JLabel accountjla = new JLabel ("账号: ");
JTextField accountjtf = new JTextField (33);// 33个字符宽度
JLabel passwordjla = new JLabel ("密码: ");
JPasswordField passwordjpf = new JPasswordField (33);// 33个字符宽度
JButton loginjbt = new JButton ("登录");
JButton registjbt = new JButton ("注册");
// 添加组件 按顺序添加
jf.add (imgjla);
jf.add (accountjla);
jf.add (accountjtf);
jf.add (passwordjla);
jf.add (passwordjpf);
jf.add (loginjbt);
jf.add (registjbt);
jf.setVisible (true);
// 创建监听器对象 并添加给登录注册按钮
UIListener uiListener = new UIListener ();
loginjbt.addActionListener (uiListener);
registjbt.addActionListener (uiListener);
// 将界面上的输入框对象变量名 中存储的输入框对象地址 复制一份给监听器对象中输入框对象变量名
uiListener.accountjtf = accountjtf;
uiListener.passwordjpf = passwordjpf;
}
public static void main(String[] args){
new UserUI ().initUI ();
}
}
运行后显示界面如下所示:

1:创建一个类UIListener实现(imp\n\nements) ActionListener,类似于继承
2:在类中复制ActionListener 中的actionPerformed方法过来,改分号为大括号
3:在方法中添加按钮点击之后要执行的代码
4:创建一个UIListener对象添加给所需要被监听的按钮 addActionListener(UIListener对象)
在UserUI类中,还需要将界面上的输入框对象变量名 中存储的输入框对象地址 复制一份给监听器对象中输入框对象变量名。因为监听器和界面在两个类中,我要为界面中的按钮添加动作监听器,就必然需要在监听器里通过界面的对象来调用方法获取密码框的值,那么我们需要把对象从界面这个类传递到监听器中,在监听器中获取数据来进去判断,再得到相应的输出。
// 创建监听器对象 并添加给登录注册按钮
UIListener uiListener = new UIListener ();
loginjbt.addActionListener (uiListener);
registjbt.addActionListener (uiListener);
// 将界面上的输入框对象变量名 中存储的输入框对象地址 复制一份给监听器对象中输入框对象变量名
uiListener.accountjtf = accountjtf;
uiListener.passwordjpf = passwordjpf;
具体代码:
package login;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class UIListener implements ActionListener{
JTextField accountjtf;
JPasswordField passwordjpf;
// 创建一个用户数组
User[] userList = new User[10];
int index = 0;
// 重写点击按钮会调用的方法
// ActionEvent 动作事件 用来获取当前被点击的按钮的信息
@Override
public void actionPerformed(ActionEvent e){
// 获取 按钮上的文本 用来判断是哪个按钮被点击了
String ac = e.getActionCommand ();
// 获取输入框中的账号密码 进行验证 登录 注册
String account = accountjtf.getText ();
String password = passwordjpf.getText ();
System.out.println ("账号: " + account + " 密码: " + password);
if(account.equals ("") || password.equals ("")){
JOptionPane.showMessageDialog (null, "账号或密码不能为空");
return;
}
if(ac.equals ("登录")){
System.out.println ("登录按钮被点击了");
// 验证这个账号是否已经被注册过
for(int i = 0; i < index; i++){
User user = userList[i];
if(user.account.equals (account)){
boolean isLogin = user.login (password);
if(isLogin){
// 弹窗
JOptionPane.showMessageDialog (null, "登录成功");
// 小窗 信息显示
// 创建一个小窗对象
JFrame jf = new JFrame ("欢迎登录");
jf.setSize (400, 400);
JLabel info = new JLabel ();
info.setText ("欢迎您: " + user.showInfo ());
jf.add (info);
jf.setVisible (true);
} else{
// 弹窗
JOptionPane.showMessageDialog (null, "登录错误");
}
return;
}
}
JOptionPane.showMessageDialog (null, "账号不存在,请先注册~");
} else if(ac.equals ("注册")){
System.out.println ("注册按钮被点击了");
// 验证这个账号是否已经被注册过
for(int i = 0; i < index; i++){
User user = userList[i];
if(user.account.equals (account)){
// 弹窗
JOptionPane.showMessageDialog (null, "账号已经被注册过了");
return;
}
}
// 循环结束后 都没有弹窗 就表示这个账号没有被注册过
User user = new User ();
user.account = account;
user.password = password;
// 将存储了数据的用户对象 存储到数组中
userList[index] = user;
index++;
// 弹窗
JOptionPane.showMessageDialog (null, "注册成功,请登录~");
}
}
}
在上述代码中,通过ActionEvent 动作事件来获取当前被点击的按钮的信息,点击登录按钮后,控制台输出“登录按钮被点击了”,同样点击注册按钮后,控制台输出“注册按钮被点击了”。添加空值条件设置一个弹窗,即当账号或密码输入框为空时,弹框显示“账号或密码不能为空”。
if(account.equals("")||password.equals("")){
JOptionPane.showMessageDialog (null,"账号或密码不能为空");
return;
}

创建一个数组存放注册信息,以便在注册时验证这个账号是否已经被注册过。如果注册过则直接登录,没有注册过,则弹窗显示“账号不存在,请先注册~”。如果账号注册过,则显示“账号已经被注册过了”。
for(int i = 0; i \u003C index; i++){
User user = userList[i];
if(user.account.equals (account)){
boolean isLogin = user.login (password);
}
}
JOptionPane.showMessageDialog (null, "账号不存在,请先注册~");
} else if(ac.equals ("注册")){
System.out.println ("注册按钮被点击了");
// 验证这个账号是否已经被注册过
for(int i = 0; i \u003C index; i++){
User user = userList[i];
if(user.account.equals (account)){
// 弹窗
JOptionPane.showMessageDialog (null, "账号已经被注册过了");
return;
}
}


利用条件语句,添加登录返回条件,点击登录按钮后,弹窗显示“登陆成功”,设置一个登录成功以后弹出的界面,界面内容显示用户信息,否则显示“登录错误”。当按下按钮时,让监听器来判断账号密码是不是匹配,如果匹配,则跳出登陆成功界面。
if(user.account.equals (account)){
boolean isLogin = user.login (password);
if(isLogin){
// 弹窗
JOptionPane.showMessageDialog (null, "登录成功");
// 小窗 信息显示
// 创建一个小窗对象
JFrame jf = new JFrame (\"欢迎登录\");
jf.setSize (400, 400);
JLabel info = new JLabel ();
info.setText ("欢迎您:" + user.showInfo ());
jf.add (info);
jf.setVisible (true)
} else{
// 弹窗
JOptionPane.showMessageDialog (null, "登录错误");
}
return;
}

创建User类返回登录后,弹出界面的信息内容。用字符连接方式显示用户信息,并设置在线状态的改变。
package login;
import javax.swing.*;
public class User {
String account;
String password;
int score;
boolean isOnline;
public String showInfo(){
String info = "账号: " + account + " 密码: " + password + " 积分: " + score + "是否在线: " + isOnline;
return info;
}
public boolean checkPwd(String pwdIn){
if(pwdIn.equals (password)){
return true;
} else{
return false;
}
}
public boolean login(String pwdIn){
if(checkPwd (pwdIn)){
if(isOnline){
JOptionPane.showMessageDialog (null, "账号已经在线了");
return false;
}
isOnline = true;
score += 5;
return true;
} else{
return false;
}
}
}
2、计算器代码
①calculate类:计算器运算

package POJO;
import java.math.BigDecimal;
import java.util.Stack;
public class calculate {
// 符号栈
private Stack<String> signStack = new Stack();
// 数字栈
private Stack<BigDecimal> numStack = new Stack();
/*******************************************将军的恩情还不完*************************************************/
// 额switch可以判断引用类型变量的值相等吗{0:'+', 1:'-', 2:'x', 3:'/'}
private static final String signCode = "+-x/()";
// 计算器主体模块
public BigDecimal work(BigDecimal caled, BigDecimal cal, String sign) {
BigDecimal ans = null;
switch (signCode.indexOf(sign)) {
case 0:
ans = caled.add(cal);
break;
case 1:
ans = caled.subtract(cal);
break;
case 2:
ans = caled.multiply(cal);
break;
case 3:
try {
ans = caled.divide(cal);
}catch (ArithmeticException AE) {
if(AE.getLocalizedMessage().equals("Non-terminating decimal expansion; no exact representable decimal result."))
ans = caled.divide(cal, 5, BigDecimal.ROUND_HALF_UP);
else
ans = BigDecimal.valueOf(32202);
System.out.println("Exception : "+AE.getLocalizedMessage());
}
break;
case 4:
case 5:
this.numStack.push(caled);
ans = cal;
break;
default:
ans = null;
}
return ans;
}
// 设计开方(牛顿莱布尼兹)
public static BigDecimal niuton(BigDecimal caled) {
BigDecimal ans;
if (caled.doubleValue() < 0) {
System.out.println("Exception : Negative caled");
return BigDecimal.valueOf(32202);
}
double x = 1;
double y = x - (x * x - caled.doubleValue()) / (2 * x);
while (x - y > 0.00000001 || x - y < -0.00000001) {
x = y;
y = x - (x * x - caled.doubleValue()) / (2 * x);
}
ans = BigDecimal.valueOf(y);
return ans;
}
// 设计平方
public static BigDecimal square(BigDecimal caled) {
return caled.pow(2);
}
// 设计清屏
public void refresh() {
this.numStack.clear();
this.signStack.clear();
this.signStack.push("=");
// 解决计算当(x+y)后输入符号时,需要出栈两个数进行括号运算(即将数按顺序压回去)时数字栈只有一个栈的问题。
this.numStack.push(new BigDecimal(0));
}
/**********************************************入集中营**************************************************/
// 索引,见详细设计
private String index = "+-x/()=";
// 数据,见详细设计^^_ ,>为0,<为1,=为2,null为3
private int[][] compareToSign = {{0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0}, {1, 1, 1, 1, 1, 2, 3}, {0, 0, 0, 0, 3, 0, 0}, {1, 1, 1, 1, 1, 3, 2}};
// 数字入栈
public void numPush(String decimal) {
this.numStack.push(new BigDecimal(decimal));
}
public void numPush(BigDecimal decimal) {
this.numStack.push(decimal);
}
// 控制流,详细见详细设计p1
public void calIOC(String topSign) {
BigDecimal caled, cal;
String temp;
temp = this.signStack.peek();
switch (this.compareToSign[index.indexOf(temp)][index.indexOf(topSign)]) {
case 0:
cal = this.numStack.pop();
caled = this.numStack.pop();
temp = this.signStack.pop();
this.numStack.push(this.work(caled, cal, temp));
this.signStack.push(topSign);
break;
case 1:
this.signStack.push(topSign);
break;
case 2:
this.signStack.pop();
break;
default:
System.out.println("Exception : wrong I/O");
break;
}
}
// 等号入栈
public BigDecimal equaIOC() {
BigDecimal ans, caled, cal;
String topSign;
while (!"=".equals(this.signStack.peek())) {
topSign = this.signStack.pop();
cal = this.numStack.pop();
caled = this.numStack.pop();
this.numStack.push(this.work(caled, cal, topSign));
}
ans = this.numStack.pop();
return ans;
}
// pow的IO流控制
public void powIOC(String topSign) {
BigDecimal temp;
temp = this.numStack.pop();
if (topSign.equals("^2")) {
this.numStack.push(calculate.square(temp));
} else {
this.numStack.push(calculate.niuton(temp));
}
}
// 通过循环执行运算功能直到左括号为栈顶符号来规避括号内有运算符
public void barcketIOC() {
BigDecimal caled, cal;
String topSign;
while (!"(".equals(this.signStack.peek())) {
topSign = this.signStack.pop();
cal = this.numStack.pop();
caled = this.numStack.pop();
this.numStack.push(this.work(caled, cal, topSign));
}
this.signStack.pop();
}
}

②calculator类:计算器UI设计(基于上次小组作业,添加变量存储计算器计算过程级结果)

package com.auqa.version;
// 导入自己的计算类
import POJO.calculate;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.sql.SQLException;
// 计算器界面
public class calculator extends JFrame implements ActionListener {
Records rec = new Records();
// 获得显示屏大小
public static final int SCREAM_HEIGHT = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
// 根据显示屏高度设定计算器界面大小
private static final int EXAMPLE = (int) (SCREAM_HEIGHT / 4.32);
// 字体大小
Font cu = new Font("粗体", Font.BOLD, (int) (EXAMPLE * 0.2));
/**********************************************超级初始化块*******************************************************/
protected void __init__() {
// 设置窗口名称
this.setTitle("计算器");
// 4比3固定窗口
this.setSize(EXAMPLE * 3, EXAMPLE * 4);
this.setResizable(false);
this.setLocationRelativeTo(null);
// 设置窗口可见
this.setVisible(true);
this.setBackground(Color.black);
// 设置关闭按钮(释放进程)
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
// 设置方向布局
this.setLayout(new BorderLayout());
}
/**********************************************北国风光*******************************************************/
// 北面组件
private JPanel northBox = new JPanel(new FlowLayout());
private JTextField input = new JTextField();
private JButton clear = new JButton();
// 设置北面组件
private void setNorth() {
// 设置数字栏
this.input.setPreferredSize(new Dimension((int) (EXAMPLE * 2.2), (int) (EXAMPLE * 0.4)));
this.input.setFont(this.cu);
this.input.setForeground(Color.BLACK); // 额好像没用,但限制用户输入更重要
this.input.setEnabled(false);
this.input.setHorizontalAlignment(SwingConstants.RIGHT);
// 设置清空
this.clear.setText("C");
this.clear.setPreferredSize(new Dimension((int) (EXAMPLE * 0.4), (int) (EXAMPLE * 0.4)));
this.clear.setFont(this.cu);
this.clear.setForeground(Color.RED);
// 安装北仪表
this.northBox.add(this.input);
this.northBox.add(this.clear);
// 安装北仪表到主体
this.add(this.northBox, BorderLayout.NORTH);
}
/**********************************************中央处理器*******************************************************/
// 中部组件
private JPanel CPU = new JPanel();
private JButton[] cal = new JButton[20];
// 后16个按钮顺序,懒得写集合类了
String str = "789/456x123-0.=+";
// 设置中部组件
private void setCenter() {
// 划分20格
this.CPU.setLayout(new GridLayout(5, 4));
// 设置开方按钮
this.cal[0] = new JButton();
this.cal[0].setText("^-2");
this.cal[0].setPreferredSize(new Dimension((int) (EXAMPLE * 0.2), (int) (EXAMPLE * 0.15)));
this.cal[0].setFont(this.cu);
this.cal[0].setForeground(Color.BLUE);
// 设置括号按钮
this.cal[1] = new JButton();
this.cal[1].setText("^2");
this.cal[1].setPreferredSize(new Dimension((int) (EXAMPLE * 0.2), (int) (EXAMPLE * 0.15)));
this.cal[1].setFont(this.cu);
this.cal[1].setForeground(Color.BLUE);
this.cal[2] = new JButton();
this.cal[2].setText("(");
this.cal[2].setPreferredSize(new Dimension((int) (EXAMPLE * 0.2), (int) (EXAMPLE * 0.15)));
this.cal[2].setFont(this.cu);
this.cal[2].setForeground(Color.BLUE);
// 设置清除按钮
this.cal[3] = new JButton();
this.cal[3].setText(")");
this.cal[3].setPreferredSize(new Dimension((int) (EXAMPLE * 0.2), (int) (EXAMPLE * 0.15)));
this.cal[3].setFont(this.cu);
this.cal[3].setForeground(Color.BLUE);
// 设置后16个按钮
for (int i = 4; i < 20; i++) {
String temp = this.str.substring(i - 4, i - 3);
this.cal[i] = new JButton();
this.cal[i].setText(temp);
this.cal[i].setPreferredSize(new Dimension((int) (EXAMPLE * 0.2), (int) (EXAMPLE * 0.15)));
this.cal[i].setFont(this.cu);
if ("+-x/=".contains(temp)) {
this.cal[i].setForeground(Color.GRAY);
}
}
// 添加按钮
for (int i = 0; i < 20; i++) {
this.CPU.add(this.cal[i]);
}
this.add(this.CPU,BorderLayout.CENTER);
}
/********************************************** 南柯一梦 *******************************************************/
public String uid;
public void setUid(String id) {
this.uid = id;
}
// 南面组件
private JLabel message = new JLabel("welcome,", SwingConstants.CENTER);
// 设置南面组件
private void setSouth() {
this.message.setText("welcome," + this.uid);
this.message.setPreferredSize(new Dimension((int) (EXAMPLE * 0.1), (int) (EXAMPLE * 0.1)));
this.message.setForeground(Color.BLACK);
this.add(this.message, BorderLayout.SOUTH);
}
/*********************************************监听*********************************************************/
// 给按钮添加监听
private void setListener() {
for (JButton j : cal) {
j.addActionListener(this);
}
this.clear.addActionListener(this);
}
// 监听事件设置
@Override
public void actionPerformed(ActionEvent e) {
String listen = e.getActionCommand();
if ("0.1^23456789+-x/()^-2".contains(listen)) {
this.input.setText(this.input.getText() + listen);
}
this.bigWork(listen);
}
/*****************************************状态**************************************************/
// 小数点信号
private Boolean pointSignal = false;
// 括号信号
private int barcketNum = 0;
private String num = "0123456789";
private String sign = "+-x/(";
// 输入的最后一位为数字时的状态,详细见详细设计表格
public void inNum() {
// 只能输入pow函数,右括号,数字和符号按钮,不能输入左括号,若小数点信号为真,则可以输入小数点
for (int i=0;i<20;i++) {
if("(".equals(this.cal[i].getText())) {
this.cal[i].setEnabled(false);
}
else {
this.cal[i].setEnabled(true);
}
}
// 根据信号设置
this.cal[17].setEnabled(this.pointSignal);
}
// 输入的最后一位为符号或左括号时
public void inSign() {
// 只能输入非小数点数字及左括号,小数点信号开启
for (int i=0;i<20;i++) {
if("(".equals(this.cal[i].getText()) || this.num.contains(this.cal[i].getText())) {
this.cal[i].setEnabled(true);
}
else {
this.cal[i].setEnabled(false);
}
}
this.pointSignal = true;
}
// 输入最后一位为右括号或pow运算时
public void inPow() {
// 只能输入符号和右括号和pow函数
for (int i=0;i<20;i++) {
if("(".equals(this.cal[i].getText()) || this.num.contains(this.cal[i].getText()) || ".".equals(this.cal[i].getText())) {
this.cal[i].setEnabled(false);
}
else {
this.cal[i].setEnabled(true);
}
}
}
// 输入最后一位为小数点时
public void inPoint() {
// 只能输入非小数点数字,小数点信号关闭
for (int i=0;i<20;i++) {
if(this.num.contains(this.cal[i].getText())) {
this.cal[i].setEnabled(true);
}
else {
this.cal[i].setEnabled(false);
}
}
this.pointSignal = false;
}
public void inEqual() {
for (int i=0;i<20;i++) {
this.cal[i].setEnabled(false);
}
}
/*****************************************核酸隔离点*********************************************/
// 真正的超级初始化块
public calculator() throws HeadlessException, SQLException, ClassNotFoundException {
// 界面设置
this.__init__();
this.setNorth();
this.setCenter();
this.setSouth();
// 交互设置
this.setListener();
JOptionPane.showMessageDialog(this, "由于框架原因,本计算器打开时可能按钮显示不全,请最小化后打开");
this.inSign();
this.calculate.refresh();
}
calculate calculate = new calculate();
private String temStr = "";
// 记录公式及答案为后续拓展提供api
private String records;
private String result;
public void setCaled(String caled) {
this.records = caled;
}
public void setAns(BigDecimal ans) {
this.result = ans.toString();
}
public String getCaled() {
return records;
}
public String getAns() {
return result;
}
// 控制器
public void bigWork(String listen) {
// 记录括号信号
if ("(".equals(listen)) {
this.barcketNum++;
}
if (")".equals(listen)) {
this.barcketNum--;
}
// 基础状体转换
if (this.num.contains(listen)) {
this.temStr = this.temStr +listen;
this.inNum();
} else if (this.sign.contains(listen)) {
if(!"".equals(temStr)) {
this.calculate.numPush(this.temStr);
this.temStr = "";
}
this.calculate.calIOC(listen);
this.inSign();
} else if (")".equals(listen) || listen.contains("^")) {
if(!"".equals(temStr)) {
this.calculate.numPush(this.temStr);
this.temStr = "";
}
if (listen.contains("^")) {
calculate.powIOC(listen);
} else {
this.calculate.barcketIOC();
}
this.inPow();
} else if (".".equals(listen)) {
this.temStr = this.temStr +listen;
this.inPoint();
} else if ("=".equals(listen)) {
if(!"".equals(temStr)) {
this.calculate.numPush(this.temStr);
this.temStr = "";
}
this.setCaled(this.input.getText());
this.setAns(this.calculate.equaIOC());
try {
rec.excuteins(uid,records,result);
} catch (Exception e) {
throw new RuntimeException(e);
}
this.input.setText(this.result);
this.inEqual();
}else if ("C".equals(listen)) {
this.calculate.refresh();
this.input.setText("");
this.temStr = "";
this.barcketNum = 0;
this.inSign();
} else {
JOptionPane.showMessageDialog(this, "error : unvaild input");
}
// 限制用户输入
if (this.barcketNum < 0) {
JOptionPane.showMessageDialog(this,"error : wrong number of barcket");
}
if(this.barcketNum == 0) {
this.cal[3].setEnabled(false);
}
if (this.barcketNum > 0) {
this.cal[18].setEnabled(false);
}
}
public calculator(String uid) throws HeadlessException, SQLException, ClassNotFoundException {
// 界面设置
this.__init__();
this.setNorth();
this.setCenter();
// 获取uid
this.setUid(uid);
this.setSouth();
// 交互设置
this.setListener();
JOptionPane.showMessageDialog(this, "由于框架原因,本计算器打开时可能按钮显示不全,请最小化后打开");
this.inSign();
this.calculate.refresh();
}
}
