第二次作业

一、 实验目的

1.掌握软件开发的基本流程

 2.掌握常用的软件开发方式和工具

二、实验内容

设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录,数据使用数据库保存

三、软件设计

1.注册登录界面的程序流程图

 2.计算器的程序流程图

 

 

四、登录注册页面

1.登陆注册

2.注册成功

 3.注册信息无效

 4.登录成功

 5.登录失败

 

五、计算器页面

1.加法

 2.减法

 3.乘法

 4.除法

 5.开方

 

 六、代码实现

1.注册登录

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Test1 extends JFrame{
//创建文本标签和文本框
JLabel usernamel=new JLabel("用户名");
JLabel usernuml=new JLabel("密码 ");
JTextField usernamet=new JTextField(18);
JTextField usernumt=new JTextField(18);

//创建一个容器用来储存
JPanel jp=new JPanel();

//注册和登录的按钮
JButton jbutton1=new JButton("注册");
JButton jbutton2=new JButton("登录");
public Test1() {

Toolkit t=Toolkit.getDefaultToolkit();//工具类
Dimension d=t.getScreenSize();

int height=(int)d.getHeight();//得到显示屏的高度
int width=(int)d.getWidth();//得到显示屏的宽度
this.setBounds((width-300)/2, (height-400)/2, 250, 150);//设置一个宽为250,高为150的窗口,并且让窗口居中

this.setDefaultCloseOperation(3);//关闭窗口的同时,结束运行
this.setTitle("登录系统");//窗口标题
init();
this.setVisible(true);//让窗口显示
}
public void init() {
//将内容添加到容器中
jp.add(usernamel);
jp.add(usernamet);
jp.add(usernuml);
jp.add(usernumt);
jp.add(jbutton1);
jp.add(jbutton2);

jbutton1.addActionListener(new ActionListener() {//添加监听器
//将用户名和密码写入文件中的操作
@Override
public void actionPerformed(ActionEvent e) {
try {
BufferedWriter w=new BufferedWriter(new FileWriter("D:/登录.txt",true));
String sum=usernamet.getText()+" "+usernumt.getText();//中间加了空格是为了确保后续登录与文件数据匹配的稳定性
BufferedReader r=new BufferedReader(new FileReader("D:/登录.txt"));
boolean cot=true;
String s;
while((s=r.readLine())!=null) {
if(sum.equals(s)) {
cot=false;//如果符合其中一条数据,说明该数据就已经存在了,就不能在注册
}
}
if(cot) {
w.write(sum);
w.newLine();
w.flush();
w.close();
JOptionPane.showMessageDialog(null, "注册成功!");//对按了注册按钮做出的回应
}else {
JOptionPane.showMessageDialog(null, "已经存在了,请更换用户名和密码!");//对按了注册按钮做出的回应
}
} catch (IOException e1) {
e1.printStackTrace();
}

}
});

jbutton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String sum=usernamet.getText()+" "+usernumt.getText();//中间加了空格是为了确保与文件数据匹配的稳定性
//对用户名和密码进行匹配
boolean cot=false;
String s;
try {
BufferedReader r=new BufferedReader(new FileReader("D:/登录.txt"));
while((s=r.readLine())!=null) {
if(s.equals(sum)) {
cot=true;//如果符合其中一条数据,就为登录成功
}
}
//对按登录按钮做出的回应
if(cot) {
JOptionPane.showMessageDialog(null, "登录成功!");
}else {
JOptionPane.showMessageDialog(null, "用户名或者密码错误,登录失败!");
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
this.add(jp);
}
public static void main(String[] args) {
new Test1();
}
}

 

2.计算器

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.String;

class WindowOperation extends JFrame {
JMenuBar menuBar; //菜单条
JMenu menu1, menu2, menu3; //菜单
JPanel panel; //按钮面板
JTextArea textArea; //文本区
JButton[][] button = new JButton[6][5]; //30个按钮
String Mem = "0"; //存储区的值

WindowOperation() {
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
}

void init() {
setBounds(300, 50, 640, 700); //窗口大小
setTitle("计算器"); //窗口名称
setLayout(new BorderLayout()); //布局样式

LineBorder border = new LineBorder(Color.LIGHT_GRAY, 6, true);//文本区域边框设置
textArea = new JTextArea(2, 10); //计算区域
textArea.setFont(new Font("Calibre", Font.PLAIN, 60)); //设置字体、样式、大小
textArea.setBorder(border);

String [][] str = {
{"MC", "MR", "MS", "M+", "M-"},
{"<—", "CE", "C", "±", "√"},
{"7", "8", "9", "/", "%"},
{"4", "5", "6", "*", "1/x"},
{"1", "2", "3", "-", "^2"},
{"00", "0", ".", "+", "="}
};

panel = new JPanel();
panel.setLayout(new GridLayout(6, 5));
for (int i = 0; i < 6; i++) { //插入各个功能、数字按钮
for (int j = 0; j < 5; j++) {
button[i][j] = new JButton(str[i][j]);
button[i][j].setFont(new Font("黑体", Font.BOLD, 30)); //设置按钮字体、样式、大小
panel.add(button[i][j]);
}
}
add(textArea, BorderLayout.NORTH);
add(panel);

menu1 = new JMenu(" 查看(V) ");
menu1.setFont(new Font("宋体", Font.BOLD, 20)); //设置字体、样式、大小
menu2 = new JMenu(" 编辑(E) ");
menu2.setFont(new Font("宋体", Font.BOLD, 20));
menu3 = new JMenu(" 帮助(H) ");
menu3.setFont(new Font("宋体", Font.BOLD, 20));
menuBar = new JMenuBar();
menuBar.add(menu1);
menuBar.add(menu2);
menuBar.add(menu3);
setJMenuBar(menuBar);

Event();
}

public void Event() { //对各种事件注册监视器
for (int i = 2; i < 6; i++) {
for (int j = 0; j < 5; j++) {
//除了”=“和”MC“等功能键,全部设置自己的监视器
if(i != 5 || j != 4)
button[i][j].addActionListener(new TextListener(button[i][j], textArea));
}
}
//清楚存储区数值
button[0][0].addActionListener((e -> Mem = "0"));
//显示存储区数值字符串
button[0][1].addActionListener(e -> textArea.setText(Mem));
//存储结果
button[0][2].addActionListener(e -> {
Mem = textArea.getText();
Mem = Mem.substring(Mem.indexOf('\n')+1); //去掉第一行字符串,只留下结果
});
//当前文本区的值与存储区的值相加
button[0][3].addActionListener(e -> {
double x1, x2;
x1 = Double.parseDouble(Mem);
x2 = Double.parseDouble(textArea.getText());
Mem = "" + (x1 + x2);
});
button[0][4].addActionListener(e -> {
double x1, x2;
x1 = Double.parseDouble(Mem);
x2 = Double.parseDouble(textArea.getText());
Mem = "" + (x2 - x1);
});
button[1][0].addActionListener(new BackListener(textArea));
button[1][1].addActionListener(new BackListener(textArea));
button[1][2].addActionListener(new ClearListener(textArea));
button[1][3].addActionListener(new TextListener(button[1][3], textArea));
button[1][4].addActionListener(new TextListener(button[1][4], textArea));
button[5][4].addActionListener(new ResultListener(textArea));
}
}

class ResultListener implements ActionListener {
JTextArea textArea;
String str; //用来保存文本区域的字符串;
public ResultListener(JTextArea textArea1) { //将文本区传入
textArea = textArea1;
}
public void actionPerformed(ActionEvent e) {
textArea.setText(textArea.getText() + "="); //获取文本内容
str = textArea.getText();

if (str.contains("+")) { //如果字符串中包含“+”,做加法运算
String str1 = str.substring(0, str.indexOf('+')); //获取加数
String str2 = str.substring(str.indexOf('+') + 1, str.indexOf('=')); //获取被加数
double x1 = Double.parseDouble(str1); //转化为double类型
double x2 = Double.parseDouble(str2);
textArea.setText(str + "\n" + (x1 + x2));
}
else if (str.contains("*")) { //乘法运算
String str1 = str.substring(0, str.indexOf('*'));
String str2 = str.substring(str.indexOf('*') + 1, str.indexOf('='));
double x1 = Double.parseDouble(str1);
double x2 = Double.parseDouble(str2);
textArea.setText(str + "\n" + x1 * x2);
}
else if(str.contains("1/x")) { //倒数运算
String str1 = str.substring(0, str.indexOf("1/x"));
double x1 = Double.parseDouble(str1);
if(x1 == 0) textArea.setText(str + "\n" + "不能求倒数");
else textArea.setText(str + "\n" + 1/x1);
}
else if (str.contains("/")) { //除法运算
String str1 = str.substring(0, str.indexOf('/'));
String str2 = str.substring(str.indexOf('/') + 1, str.indexOf('='));
double x1 = Double.parseDouble(str1);
double x2 = Double.parseDouble(str2);
if (x2 == 0) textArea.setText(str + "\n" + "不能除以0");
else textArea.setText(str + "\n" + x1 / x2);
}
else if (str.contains("^2")) { //平方运算
String str1 = str.substring(0, str.indexOf('^'));
double x = Double.parseDouble(str1);
textArea.setText(str + "\n" + x * x);
}
else if (str.contains("√")) { //开方运算
String str1 = str.substring(str.indexOf('√') + 1, str.indexOf('='));
double x = Double.parseDouble(str1);
textArea.setText(str + "\n" + Math.sqrt(x));
}
else if (str.contains("±")) { //加减运算
String str1 = str.substring(0, str.indexOf('±'));
String str2 = str.substring(str.indexOf('±') + 1, str.indexOf('='));
double x1 = Double.parseDouble(str1);
double x2 = Double.parseDouble(str2);
if (x2 == 0) textArea.setText(str + "\n" + x1);
else textArea.setText(str + "\n" + (x1 + x2) + " &amp; " + (x1 - x2));
}
else if (str.contains("%")) { //百分号运算
String str1 = str.substring(0, str.indexOf('%'));
double x1 = Double.parseDouble(str1);
textArea.setText(str + "\n" + x1/100);

}
else if (str.contains("-")) { //减法运算
if(str.charAt(0) == '-') { //如果第一个字符是“-”,形如-2-3形式,就转化成为-(2+3)形式
String str_x = str;
str = str.substring(1);
String str1 = str.substring(0, str.indexOf('-'));
String str2 = str.substring(str.indexOf('-') + 1, str.indexOf('='));
double x1 = Double.parseDouble(str1);
double x2 = Double.parseDouble(str2);
textArea.setText(str_x + "\n" + (-x1-x2));
}
else {
String str1 = str.substring(0, str.indexOf('-'));
String str2 = str.substring(str.indexOf('-') + 1, str.indexOf('='));
double x1 = Double.parseDouble(str1);
double x2 = Double.parseDouble(str2);
textArea.setText(str + "\n" + (x1-x2));
}
}

}
}

class ClearListener implements ActionListener {
JTextArea textArea;
public ClearListener(JTextArea textArea1) { //将按钮和文本区传入
textArea = textArea1;
}
public void actionPerformed(ActionEvent e) { //设置文本区
textArea.setText("");
}
}

class BackListener implements ActionListener {
JTextArea textArea;
String str;
public BackListener(JTextArea textArea1) { //将文本区传入
textArea = textArea1;
}
public void actionPerformed(ActionEvent e) { //设置文本区
str = textArea.getText();
if(str.length() == 0) textArea.setText(""); //如果文本区内容为空,输出为空
else { //否则让当前文本区删掉最后一个符号/数字
str = str.substring(0, str.length()-1);
textArea.setText(str);
}
}
}

class TextListener implements ActionListener {
JButton button;
JTextArea textArea;
public TextListener(JButton button1, JTextArea textArea1) { //将按钮和文本区传入
textArea = textArea1;
button = button1;
}
public void actionPerformed(ActionEvent e) { //设置文本区
textArea.setText(textArea.getText() + button.getText());
}
}

public class Calculator {
public static void main(String[] args) {
new WindowOperation();
}
}

七、连接数据库

1.用户记录

 

 2.连接数据库

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class Test1 extends JFrame {
    // 其他部分的代码

    // 数据库连接信息
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/your_database_name";
    static final String USER = "your_username";
    static final String PASS = "your_password";

    public void init() {
        // 其他部分的代码...

        jbutton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String username = usernamet.getText();
                String password = usernumt.getText();
                if (registerUser(username, password)) {
                    JOptionPane.showMessageDialog(null, "注册成功!");
                } else {
                    JOptionPane.showMessageDialog(null, "注册失败!");
                }
            }
        });

        jbutton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String username = usernamet.getText();
                String password = usernumt.getText();
                if (validateUser(username, password)) {
                    JOptionPane.showMessageDialog(null, "登录成功!");
                } else {
                    JOptionPane.showMessageDialog(null, "用户名或密码错误,登录失败!");
                }
            }
        });

        this.add(jp);
    }

    // 注册用户并将信息保存到数据库
    private boolean registerUser(String username, String password) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            int rowsAffected = stmt.executeUpdate();
            return rowsAffected > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }

    // 验证用户信息
    private boolean validateUser(String username, String password) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            rs = stmt.executeQuery();
            return rs.next();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new Test1();
    }
}

posted @   小橙仔  阅读(21)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示