变量accountNumber验证数据为123456
变量password验证数据为456789
编码软件:IntelliJ IDEA 2020.1.1 x64
欢迎探讨或提出建议
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//Java类包导入
public class Demo extends JFrame {//让我们的Demo类继承JFrame窗体类
static String accountNumber;//我们的账号变量 用于验证
public String password;//我们的密码变量 用于验证
Font font = new Font("黑体",Font.BOLD,18);//标签字体的设置
public Demo(String title){//使用构造器来制作窗体 构造器参数是窗体的名字
setTitle(title);//使用构造器传进的变量作为名字,方便名称更改
setBounds(50,50,400,200);//设置窗体自身位置和大小
setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗体的关闭方式
Container c = getContentPane();//获得窗体容器进行布局设置和添加组件
c.setLayout(null);//设置绝对布局 这里不建议使用流动布局 new FlowLayout 因为无法控制位置 其他布局比较麻烦
JLabel jLabel1 = new JLabel("账号:");//账号位置提示标签 一眼锁定区域
jLabel1.setBounds(20,50,80,20);//设置这个标签的位置大小
jLabel1.setFont(font);//设置这个标签的字体和样式,其font是我们上面的Font类对象
c.add(jLabel1);//向容器添加这个标签
JTextField jTextField1 = new JTextField(10);//创建一个输入框 这是账号输入框
jTextField1.setBounds(90,50,140,20);//设置账号输入框的位置和大小
c.add(jTextField1);//添加账号输入框到容器
JLabel jLabel2 = new JLabel("密码:");//密码区域提示标签
jLabel2.setBounds(20,80 ,90,20);//设置密码区域提示的位置
c.add(jLabel2);//添加密码区域提示标签到容器
jLabel2.setFont(font);//设置标签字体样式
JTextField jTextField2 = new JTextField(10);//输入框二 密码输入框
jTextField2.setBounds(90,80,140,20);//设置密码输入框的位置大小
c.add(jTextField2);//向容器添加密码输入框
JButton btn = new JButton("登入");//登入按钮 我们需要在这个按钮的监听事件中做非常多的代码,也是程序的核心组件
btn.setBounds(20,110,80,40);//设置按钮的位置 让他看着更舒服和显眼
// btn.addActionListener((Action)->{//Lambda表达式写法 其可以让代码更为简洁
// System .out.println("其实我也是监听器的写法哦");//输出内容
// });//监听器结束
btn.addActionListener(new ActionListener() {//为登入按钮添加监听事件 ActionListener监听类
@Override//注释标签 无特殊意义暂且
public void actionPerformed(ActionEvent e) {//ActionListener的内部类
var getAccountNumber = jTextField1.getText();//使用一个临时的局部变量保存账号输入框内容并且传递给我们的全局变量(成员变量) "账号(accountNumber)"
var getPassword = jTextField2.getText();//使用一个临时的局部变量保存密码输入框的内容,并且传递给我吗的全局变量(成员变量) "密码(password)"
Demo.this.accountNumber = getAccountNumber;//赋值传递 accountNumber
Demo.this.password = getPassword;//赋值传递 password
//下面将是本次程序的核心内容,也是我自己临时想出来的逻辑思路,现在回想一下觉得还是挺简单容易实现的 通过变量伪造数据库和验证
//本算法解释:首先我们先用switch语句来作为第一层判断,共两层,第一层是swicth第二次是if
//一、触发了登入按钮的监听事件 此时我们的两个变量 账号和密码已经接收了两个输入框的数据
//二、第一层switch语句开始进行第一层判断,也就是账号的验证,这里switch负责账号判断,if负责密码
//三、如果我们账号变量接收的数据和我们提出的数据一致,进入if语句,也就是账号验证通过,不一致将提示错误账号的对话框和输入框变红的警告提示
//四、进入密码的判断,if语句也很简单,通过String类的equals方法(字符串内容比较),来验证我们的paswword变量数据是否和我们要求的内容一致
//五、如果if语句也通过,销毁当前的登入窗体,打开我们做好的欢迎窗口,完成整个登入流程
//总结:变量获得输入框内容,立刻通过switch语句和if语句去判断是否一致,switch嵌套if语句,
//账号和密码错误就执行swicth的defalut和if的else,极其简单的判断,在两个条件都通过后,
//执行自己已经创建好的窗体,便完成了类似登入的操作,省略了JFrame窗体的细节,主要查看算法内容
switch (Demo.this.accountNumber){//第一层判断 swicth语句判断账号是否正确
case "123456"://自己提出的账号要求
jTextField1.setBorder(BorderFactory.createLineBorder(Color.green));//账号正确,输入框添加绿色边框提示正确
if(Demo.this.password.equals("456789")){//第二次判断 if语句,调用了String的比较方法来判断
dispose();//此时已经完成了两个判断条件应该打开新的窗体 使用窗体销毁方法
JFrame jFrame = new JFrame("欢迎登入");//登入成功的窗体
jFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置新窗体的关闭方式
jFrame.setBounds(50,50,500,500);//设置新窗体的位置和大小
JLabel jLabel = new JLabel("欢迎");//设置一个欢迎表示来提示这是新窗体已经成功登入
Container c=jFrame.getContentPane();//获得新窗体的容器来添加组件和布局
c.setLayout(new FlowLayout());//使用流动布局 流动布局:组件会像水一样在窗体上会随着先后顺序在窗体上,如果窗体改变其位置也会像水一样改变,详细自查
jLabel.setForeground(Color.red);//设置欢迎标签的字体颜色让它更显眼
jLabel.setFont(new Font("微软雅黑",Font.BOLD,50));//设置欢迎标签的字体样式
c.add(jLabel);//像容器添加欢迎标签
jFrame.setVisible(true);//让新窗体显示出来 false为隐藏 默认为false所有在每次写窗体时候末尾务必加上这句 setVisible(true);哦
c.validate();//验证组件
}else{//如果if语句的密码不正确
jTextField2.setBorder(BorderFactory.createLineBorder(Color.red));//密码输入框出现红色边框线提示密码错误
JOptionPane.showMessageDialog(null,"密码错误!");//提示密码错误对话框
}//if语句结束
break;//结束switch第一个条件流程 break意思多为结束当前循环或判断 continue 跳出当前循环或判断
default://如果都不符合条件后的执行内容 如果账号不正确执行的代码
jTextField1.setBorder(BorderFactory.createLineBorder(Color.red));//账号输入框出现红色边框线提示账号错误
JOptionPane.showMessageDialog(null,"账号错误!");//弹出账号错误的对话框
}//switch语句结束
}//ActionListener监听器内部类结束
});//ActionListener监听器结束
c.add(btn);//向主窗体添加登入按钮
c.validate();//验证组件 否则可能出现组件丢失的现象
}//Demo类构造器结束
public static void main(String[] args) {//程序入口 主方法
Demo demo = new Demo("登入测试窗体");//创建Demo对象传入名称构造参数
demo.setVisible(true);//设置窗体显示
}//主方法结束
}//类结束
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class LoginFrame{
private final String PROP_FILE = "D:\\DemoProject\\src\\mysql.ini";
private String driver;
//url是数据库的服务地址
private String url;
private String user;
private String password;
//登入界面的GUI组件
private JFrame jf = new JFrame("登入");
private JTextField userField = new JTextField(20);
private JTextField passwordField = new JTextField(20);
private JButton loginButton = new JButton("登入");
public void init() throws Exception{
var connProp = new Properties();
connProp.load(new FileInputStream(PROP_FILE));
driver = connProp.getProperty("driver");
url = connProp.getProperty("url");
user = connProp.getProperty("user");
password = connProp.getProperty("password");
//加载驱动
Class.forName(driver);
//为登入按钮添加事件监听器
loginButton.addActionListener(e->{
//登入成功则显示"登入成功"
if(validate(userField.getText(),passwordField.getText())){
JOptionPane.showMessageDialog(jf,"登入成功");
}
else
{
JOptionPane.showMessageDialog(jf,"登入失败");
}
});
jf.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
jf.add(userField, BorderLayout.NORTH);
jf.add(passwordField);
jf.add(loginButton,BorderLayout.SOUTH);
jf.pack();
jf.setVisible(true);
}
private boolean validate(String userName,String userPass){
//执行查询SQL语句
var sql = "select*from jdbc_test "+
"where jdbc_name='"+userName+
"' and jdbc_desc ='" +userPass+"'";
System.out.println(sql);
try(
Connection conn = DriverManager.getConnection(url,user,password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)
){
//如果查询的ResultSet里有超过一条的记录,则登入成功
if(rs.next()){
return true;
}
}catch (Exception e){
e.printStackTrace();
}
return false;
}
public static void main(String[] args) throws Exception{
new LoginFrame().init();
}
}
并不难,这些东西学习到13章就可以自主完成了。