目 录
- 说明
- 运行后的效果
- 代码
说明
做了一个登录窗体作为练习,分享给大家,其中涉及到窗体、图板、随机数等内容,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习路上的朋友
运行后的效果
代码
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
public class LoginWindow extends JFrame {
//定义全局属性
private BufferedImage image;//验证码背景图像属性,使用带缓存的图片类封装
private DrawingBoard drawingBoard;//验证码绘图板属性
private JTextField userNameTF;//用户名文本框属性
private JPasswordField userPasswordField;//密码框属性
private JTextField captchaText;//验证码输入框属性
private String captcha = "";//存储验证码
Random random = new Random();//实例化随机类
public LoginWindow(){//构造窗体
//窗体主体结构参数
setTitle("带验证码的登录窗口");//标题
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭方式
setResizable(false);//设置窗口大小不可调
setBounds(100,100,500,280);//窗体位置及大小
//定义窗体内主体布局变量
JPanel userInfo = new JPanel();//全局布局属性
userInfo.setLayout(null);//窗体布局为空,元件位置均由代码确定
//用户名文字标签
JLabel userName = new JLabel("用户名:");//标签文本为【用户名】
userName.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式
userName.setBounds(40,60,60,20);//设置位置和大小
//用户名输入文本框设置
userNameTF = new JTextField("请输入用户名",20);//文本框默认文字及长度
userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式
userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色
userNameTF.setLocation(120,59);//文本框位置
userNameTF.setSize(300,22);//文本框大小
//密码文字标签
JLabel userPassword = new JLabel("密码:");//标签为【密码】
userPassword.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式
userPassword.setBounds(40,100,60,20);//设置位置和大小
//密码输入密码框设置
userPasswordField = new JPasswordField("请输入密码",20);//密码框默认文字及长度
userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式
userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setBounds(120,99,300,22);//密码框位置大小
userPasswordField.setEchoChar((char)0);//默认文字回显为明码
//验证码文字标签
JLabel captcha = new JLabel("验证码:");//标签为【验证码】
captcha.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式
captcha.setBounds(40,140,60,20);//设置位置和大小
//验证码文本框设置
captchaText = new JTextField();
captchaText.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式
captchaText.setBounds(120,139,100,22);//文本框位置大小
//验证码背景图片实体化对象
drawingBoard = new DrawingBoard();
drawingBoard.setBounds(240,130,100,35);//位置和大小
//【换一张】按钮设置
JButton captchaButt = new JButton("换一张");//实体化按钮,并设置按键名文本
captchaButt.setFont(new Font("宋体",Font.BOLD,14));//按键名文本格式
captchaButt.setForeground(Color.BLUE);//按键名字体颜色
captchaButt.setBorderPainted(false);//边框设置为无
captchaButt.setBackground(Color.WHITE);//按键背景颜色设置为白色
captchaButt.setBounds(360,140,80,22);//按键位置及大小
//【登录】按钮设置
JButton loginBt = new JButton("登 录");//实体化按钮,并设置按键名文本
loginBt.setFont(new Font("宋体",Font.BOLD,16));//按键名文本格式
loginBt.setBounds(120,190,100,30);//按键位置及大小
//【重置】按钮设置
JButton resetBt = new JButton("重 置");//实体化按钮,并设置按键名文本
resetBt.setFont(new Font("宋体",Font.BOLD,16));//按键名文本格式
resetBt.setBounds(260,190,100,30);//按键位置及大小
//将所有原件添加到全局布局中
userInfo.add(userName);
userInfo.add(userNameTF);
userInfo.add(userPassword);
userInfo.add(userPasswordField);
userInfo.add(captcha);
userInfo.add(captchaText);
userInfo.add(drawingBoard);
userInfo.add(captchaButt);
userInfo.add(loginBt);
userInfo.add(resetBt);
//将全局布局添加到窗体中,并居中放置
add(userInfo,BorderLayout.CENTER);
//监听按键
captchaButt.addActionListener(new Control());
loginBt.addActionListener(new Control());
resetBt.addActionListener(new Control());
userNameTF.addFocusListener(new TextFocus());
userPasswordField.addFocusListener(new PasswordFocus());
}
class DrawingBoard extends JPanel{//创建验证码绘图板
public static final int WIDTH = 120;//验证码宽度
public static final int HEIGHT = 35;//验证码高度
public void paint(Graphics g){//paint为默认方法
try {//为验证码背景图片赋值
image = ImageIO.read(new File("src/image1.jpg"));
}catch (IOException e){
e.printStackTrace();
}
//创建新图层
BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);
Graphics gs = img.getGraphics();
gs.setFont(new Font("黑体",Font.BOLD,20));
gs.fillRect(0,0,WIDTH,HEIGHT);
img.getGraphics().drawImage(image,0,0,WIDTH,HEIGHT,null);
//如果验证码不为空,则清空
if (!captcha.isEmpty()){
captcha = "";
}
//生成验证码
for (int i=0;i<4;i++){
char ctmp = (char) (random.nextInt(26) + 65); // 生成A~Z的字母
captcha += ctmp;// 更新验证码
Color color = new Color(20 + random.nextInt(120), 20 + random
.nextInt(120), 20 + random.nextInt(120));// 生成随机颜色
gs.setColor(color); // 设置颜色
Graphics2D gs2d = (Graphics2D) gs;// 将文字旋转指定角度
AffineTransform trans = new AffineTransform();// 实例化AffineTransform
trans.rotate(random.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);//进行旋转
float scaleSize = random.nextFloat() + 0.8f;// 缩放文字
if (scaleSize > 1f)
scaleSize = 1f;// 如果scaleSize大于1,则等于1
trans.scale(scaleSize, scaleSize); // 进行缩放
gs2d.setTransform(trans);// 设置AffineTransform对象
gs.drawString(String.valueOf(ctmp), WIDTH / 6 * i + 28, HEIGHT / 2);// 画出验证码
g.drawImage(img,0,0,this);//反馈验证码到窗体
}
}
}
class Control implements ActionListener{//控制键按键动作控制
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("换一张")){//按下【换一张】按键后
drawingBoard.repaint();//刷新验证码
}else if (e.getActionCommand().equals("登 录")){
String name = userNameTF.getText();//读取用户名
String password = new String(userPasswordField.getPassword());//读取密码
String code = captchaText.getText();//读取验证码
String userInfo = "";//用户登录信息返回
if (name.equals("请输入用户名") || name.isEmpty()){
userInfo = userInfo+"用户名为空,请输入用户名;";
}
if (password.equals("请输入密码") || password.isEmpty()){
userInfo = userInfo+"密码为空,请输入密码;";
}
if (code.isEmpty() || !code.equalsIgnoreCase(captcha)){
userInfo = userInfo+"验证码错误,请重新输入";
drawingBoard.repaint();//更新验证码
captchaText.setText("");//恢复验证码框初始值
}
if (userInfo.isEmpty()){
userInfo = userInfo+"登录成功";
userNameTF.setText("请输入用户名");//恢复用户名初始值
userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式
userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setText("请输入密码");//恢复密码框初始值
userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式
userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setEchoChar((char)0);//默认文字回显为明码
captchaText.setText("");//恢复验证码框初始值
drawingBoard.repaint();//更新验证码
}
JOptionPane.showMessageDialog(null,userInfo);//显示提示弹窗
}else if (e.getActionCommand().equals("重 置")){
userNameTF.setText("请输入用户名");//恢复用户名初始值
userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式
userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setText("请输入密码");//恢复密码框初始值
userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式
userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setEchoChar((char)0);//默认文字回显为明码
captchaText.setText("");//恢复验证码框初始值
drawingBoard.repaint();//更新验证码
}
}
}
class TextFocus implements FocusListener{//文本框,焦点监听
@Override
public void focusGained(FocusEvent e) {//文本框获得焦点
if (userNameTF.getText().equals("请输入用户名")){
userNameTF.setText("");//文本框清空
userNameTF.setFont(new Font("幼圆",Font.BOLD,14));//文本框用户输入文字格式
userNameTF.setForeground(Color.BLACK);//文本框用户输入文字颜色
}
}
@Override
public void focusLost(FocusEvent e) {//文本框失去焦点
if (userNameTF.getText().isEmpty()){
userNameTF.setText("请输入用户名");//恢复文本框默认值
userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框默认值字体
userNameTF.setForeground(Color.GRAY);//文本框默认值颜色
}else{
userNameTF.setFont(new Font("幼圆",Font.BOLD,14));//文本框用户输入文字格式
userNameTF.setForeground(Color.BLACK);//文本框用户输入文字颜色
}
}
}
class PasswordFocus implements FocusListener{//密码框焦点监听
@Override
public void focusGained(FocusEvent e) {//密码框获得焦点
String password = new String(userPasswordField.getPassword());//获取密码框的值
if(password.equals("请输入密码")) {
userPasswordField.setText("");//密码框清空
userPasswordField.setFont(new Font("幼圆",Font.BOLD,14));//密码框用户输入文字格式
userPasswordField.setForeground(Color.BLACK);//密码框用户输入文字颜色
userPasswordField.setEchoChar('*');//密码框用户输入回显为“*”
}
}
@Override
public void focusLost(FocusEvent e) {//密码框失去焦点
String password = new String(userPasswordField.getPassword());//获取密码框的值
if (password.isEmpty()){
userPasswordField.setText("请输入密码");//密码框默认文字
userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框默认文字格式
userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色
userPasswordField.setEchoChar((char)0);//默认文字回显为明码
}else {
userPasswordField.setFont(new Font("幼圆",Font.BOLD,14));//密码框用户输入文字格式
userPasswordField.setForeground(Color.BLACK);//密码框用户输入文字颜色
userPasswordField.setEchoChar('*');//密码框用户输入回显为“*”
}
}
}
public static void main(String[] args) {
new LoginWindow().setVisible(true);//运行窗体,并设置为元素可见
}
}