Java模拟QQ登录界面(GUI) Java GUI课后习题,模拟QQ登录界面, 附有源码以及图片

运行的结果:

源码以及图片:

阿里云盘分享 (alipan.com)

功能的实现:

 实现1:

对每个文本框进行监控,鼠标定在哪的时候,下边框变为蓝色

实现2:

用户光标定到文本框的时候,要是没有输入信息,就把里面的提示文字给清除掉,给用户一个好的体验

实现3:

登录的时候对账号和密码检验,要是账号和密码都是admin是登录成功,否则登录失败并提醒用户

没输入密码和账号的时候也进行提示

 

分析:

这个的页面分为是三个部分,分别是上 中 下.其中上是一个背景,中是登录需要输入和选择的,下是注册账号和二维码

布局:

知识点:

定位:

定位用的大部分都是绝对定位的,在学web时候,感觉绝对定位是真的好用,在这里面也是. 怎么去设置为绝对定位呢?

绝对定位的相关知识点:

绝对定位是一种在 GUI 编程中使用的布局方式,它允许你直接指定组件在容器中的精确位置和尺寸。与其他布局管理器相比,绝对定位提供了更大的灵活性,可以精确控制组件的位置和大小。

使用绝对定位时,你需要将容器的布局管理器设置为 null,这样容器就不会自动调整组件的位置和大小。然后,你可以使用 setBounds() 方法来设置组件的位置和大小。setBounds() 方法接受四个参数:x、y、width 和 height,分别表示组件的左上角在容器中的 x 和 y 坐标,以及组件的宽度和高度。

panel.setLayout(null); // 使用绝对定位
panel2.setBounds(0, 0, 591, 216); // 使用setBounds方法设置组件的位置和大小

代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MyQQLogin {
 public static void main(String[] args) {
 JFrame f = new JFrame("模拟QQ登录");
 f.setSize(600, 500);
 f.setLocation(300, 300);
 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 JPanel panel = new JPanel();
 panel.setLayout(null); // 使用绝对定位
 panel.setBackground(Color.WHITE); // 设置背景颜色为白色
 f.add(panel);
 JPanel panel2 = new JPanel();
 JLabel label = new JLabel(new ImageIcon("D:\\杂论\\background.png"));
 panel2.add(label);
 panel2.setBounds(0, 0, 591, 216); // 使用setBounds方法设置组件的位置和大小
 panel2.setBackground(Color.WHITE); // 设置背景颜色为白色
 panel.add(panel2);
 JPanel panelCenter = new JPanel();
 panelCenter.setLayout(null);//绝对定位
 panelCenter.setBackground(Color.WHITE); // 设置背景颜色为白色
 /*----------------qq号码start--------------------*/
 JPanel QQNumber = new JPanel();
 JLabel labelQQ = new JLabel(new ImageIcon("D:\\杂论\\qq.png"));
 JTextField Number = new JTextField("QQ号码/手机/邮箱", 20);
 Number.setPreferredSize(new Dimension(400, 35));
 Number.setBorder(null);
 Number.setFont(new Font("宋体", Font.PLAIN, 16));
 QQNumber.add(labelQQ);
 QQNumber.add(Number);
 QQNumber.setBounds(-100, 0, 400, 40);
 QQNumber.setBackground(Color.WHITE); // 设置背景颜色为白色
 panelCenter.add(QQNumber);
 //对Number输入框进行监控
 // 添加焦点监听器
 Number.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 Number.addFocusListener(new FocusListener() {
 @Override
 public void focusGained(FocusEvent e) {
 if (Number.getText().equals("QQ号码/手机/邮箱")) {
 Number.setText("");
 Number.setForeground(Color.BLACK);
 }
 QQNumber.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLUE));
 Number.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLUE));
 }
 @Override
 public void focusLost(FocusEvent e) {
 if (Number.getText().isEmpty()) {
 Number.setForeground(Color.GRAY);
 Number.setText("QQ号码/手机/邮箱");
 }
 QQNumber.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 Number.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 }
 });
 /*---------------qq号码end--------------------*/
 /*---------------qq密码start------------------*/
 JPanel passWord = new JPanel();
 JLabel labelPassWord = new JLabel(new ImageIcon("D:\\杂论\\password.png"));
 JTextField pass = new JTextField("密码", 20);
 pass.setPreferredSize(new Dimension(400, 35));
 pass.setBorder(null);
 pass.setFont(new Font("宋体", Font.PLAIN, 16));
 pass.setForeground(Color.GRAY);
 passWord.add(labelPassWord);
 passWord.add(pass);
 passWord.setBounds(-100, 40, 400, 40);
 passWord.setBackground(Color.WHITE); // 设置背景颜色为白色
 panelCenter.add(passWord);
 passWord.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 pass.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 pass.addFocusListener(new FocusListener() {
 @Override
 public void focusGained(FocusEvent e) {
 String password = new String(pass.getText());
 if (password.equals("密码")) {
 pass.setText("");
 pass.setForeground(Color.BLACK);
 }
 passWord.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLUE));
 pass.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLUE));
 }
 @Override
 public void focusLost(FocusEvent e) {
 String password = new String(pass.getText());
 if (password.isEmpty()) {
 pass.setForeground(Color.GRAY);
 pass.setText("密码");
 }
 passWord.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 pass.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, new Color(192, 192, 192)));
 }
 });
 /*---------------qq密码end------------------*/
 /*---------------多选按钮start--------------*/
 JPanel choice = new JPanel();
 choice.setLayout(null);
 JCheckBox automaticLogin = new JCheckBox("自动登录");
 automaticLogin.setBackground(Color.WHITE);
 automaticLogin.setBounds(0, 0, 100, 40);
 JCheckBox rememberPass = new JCheckBox("记住密码");
 rememberPass.setBounds(125, 0, 100, 40);
 JLabel findPass = new JLabel("找回密码");
 findPass.setBounds(250, 0, 100, 40);
 automaticLogin.setOpaque(false); // 设置为不透明
 rememberPass.setOpaque(false); // 设置为不透明
 findPass.setForeground(Color.black); // 设置字体颜色为蓝色
 choice.add(automaticLogin);
 choice.add(rememberPass);
 choice.add(findPass);
 choice.setBounds(0, 80, 400, 40);
 choice.setBackground(Color.WHITE); // 设置背景颜色为白色
 panelCenter.add(choice);
 /*------------多选按钮end------------*/
 /*-------------登录界面start-------------*/
 JPanel login = new JPanel();
 JButton secureLogin = new JButton("secureLogin", new ImageIcon("D:\\杂论\\安全登录.png"));
 secureLogin.setPreferredSize(new Dimension(320, 40));
 secureLogin.setBackground(new Color(8, 186, 253));
 secureLogin.setFont(new Font("Arial", Font.BOLD, 16)); // 设置字体为Arial,加粗,大小为16
 secureLogin.setForeground(Color.WHITE); // 设置字体颜色为白色
 secureLogin.setBorderPainted(false); // 去除按钮的边框绘制
 login.add(secureLogin);
 login.setBounds(0, 120, 320, 50);
 login.setBackground(new Color(8, 186,253));
 panelCenter.add(login);
 secureLogin.addActionListener(new ActionListener() {//事件的监控
 @Override
 public void actionPerformed(ActionEvent e) {
 String account = Number.getText();
 String password = pass.getText();
 if (account.equals("admin") & password.equals("admin")) {
 JOptionPane.showMessageDialog(f, "登录成功");
 } else if(account.equals("QQ号码/手机/邮箱")) {
 JOptionPane.showMessageDialog(f, "请输入账号");
 } else if(password.equals("密码")) {
 JOptionPane.showMessageDialog(f, "请输入密码");
 }
 else {
 JOptionPane.showMessageDialog(f, "账号或密码错误");
 }
 }
 });
 /*------------登录界面end----------------------*/
 JPanel last = new JPanel();
 last.setBounds(20, 420, 60, 30);
 last.setBackground(Color.WHITE); // 设置背景颜色为白色
 JPanel register = new JPanel();//注册账号
 register.setBackground(Color.WHITE);
 JLabel signIn = new JLabel("注册账号");
 signIn.setFont(new Font("宋体", Font.PLAIN, 14));// 设置字体
 signIn.setForeground(Color.GRAY);// 设置字体颜色
 register.add(signIn);
 last.add(register);
 JPanel QRCode = new JPanel();
 QRCode.setBackground(Color.WHITE);
 QRCode.setBounds(500, 400, 45, 46);
 JLabel QR = new JLabel(new ImageIcon("D:\\杂论\\QRCode.png"));
 QRCode.add(QR);
 panelCenter.setBounds(130, 240, 340, 180);//居中显示
 panel.add(panelCenter); // 将panelCenter添加到panel中
 panel.add(last);
 panel.add(QRCode);
 f.setVisible(true);
 f.addWindowListener(new WindowAdapter() {
 public void windowOpened(WindowEvent e){
 f.requestFocus(); // 将焦点设置到窗体上
 }
 });
 }
}

代码各个部分的分析:

创建JFrame对象

JFrame frame = new JFrame("QQ登录");
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setResizable(false);

通过new JFrame("QQ登录")创建一个JFrame对象,并设置标题为"QQ登录"。使用setSize()方法设置窗口的大小为400x300像素。使用setLocationRelativeTo(null)方法将窗口居中显示。使用setResizable(false)方法禁止调整窗口大小

创建主面板JPanel对象

JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);

添加JLabel组件

JPanel panel2 = new JPanel();
ImageIcon imageIcon = new ImageIcon("logo.png");
JLabel label = new JLabel(imageIcon);
panel2.add(label);
panel.add(panel2);

使用new JPanel()创建一个JPanel对象,并将其赋给panel2变量。使用new ImageIcon("logo.png")创建一个带有指定图像的ImageIcon对象,其中"logo.png"是图片文件的路径。使用new JLabel(imageIcon)创建一个带有图像的JLabel对象,并将其赋给label变量。将label添加到panel2中,然后将panel2添加到主面板panel中。

创建输入框组件和多选按钮组件

JPanel panelCenter = new JPanel();
panelCenter.setLayout(null);
panelCenter.setBackground(Color.WHITE);
JTextField accountField = new JTextField("QQ号码/手机/邮箱");
accountField.setBounds(50, 50, 300, 30);
// 添加焦点监听器,以清除和恢复默认文本
JPasswordField passwordField = new JPasswordField("密码");
passwordField.setBounds(50, 100, 300, 30);
// 添加焦点监听器,以清除和恢复默认文本
JCheckBox autoLoginCheckbox = new JCheckBox("自动登录");
autoLoginCheckbox.setBounds(50, 150, 100, 30);
JCheckBox rememberPwdCheckbox = new JCheckBox("记住密码");
rememberPwdCheckbox.setBounds(150, 150, 100, 30);
JLabel forgetPwdLabel = new JLabel("找回密码");
forgetPwdLabel.setBounds(250, 150, 100, 30);
// 添加鼠标事件监听器

使用new JPanel()创建一个JPanel对象,并将其赋给panelCenter变量。使用setLayout(null)方法将面板的布局管理器设置为绝对定位,这样可以手动指定组件的位置和大小。通过setBackground(Color.WHITE)方法将面板的背景颜色设置为白色。

使用new JTextField("QQ号码/手机/邮箱")创建一个文本框组件,并将其赋给accountField变量。使用setBounds(50, 50, 300, 30)方法设置组件的位置和大小。你可以根据需要修改这些值。

类似地,使用new JPasswordField("密码")创建一个密码输入框组件,并将其赋给passwordField变量。使用setBounds(50, 100, 300, 30)方法设置组件的位置和大小。

使用new JCheckBox("自动登录")创建一个多选按钮组件,并将其赋给autoLoginCheckbox变量。使用setBounds(50, 150, 100, 30)方法设置组件的位置和大小。

类似地,使用new JCheckBox("记住密码")创建一个多选按钮组件,并将其赋给rememberPwdCheckbox变量。使用setBounds(150, 150, 100, 30)方法设置组件的位置和大小。

使用new JLabel("找回密码")创建一个标签组件,并将其赋给forgetPwdLabel变量。使用setBounds(250, 150, 100, 30)方法设置组件的位置和大小。

监听输入框组件

为输入框组件添加焦点监听器,以在用户点击输入框时清除默认文本,并在用户离开输入框时恢复默认文本

添加登录按钮和事件监听器

JButton loginButton = new JButton("登录");
loginButton.setBounds(150, 200, 100, 30);
// 添加点击事件监听器

使用new JButton("登录")创建一个按钮组件,并将其赋给loginButton变量。使用setBounds(150, 200, 100, 30)方法设置组件的位置和大小。

你可以为登录按钮添加点击事件监听器,以执行登录操作。

创建小面板并添加到主面板中

JPanel registerPanel = new JPanel();
registerPanel.setBounds(0, 250, 200, 50);
// 添加鼠标事件监听器
JPanel qrcodePanel = new JPanel();
qrcodePanel.setBounds(200, 250, 200, 50);
// 添加鼠标事件监听器
panel.add(registerPanel);
panel.add(qrcodePanel);

使用new JPanel()创建一个JPanel对象,并将其赋给registerPanel变量。使用setBounds(0, 250, 200, 50)方法设置组件的位置和大小。

类似地,使用new JPanel()创建一个JPanel对象,并将其赋给qrcodePanel变量。使用setBounds(200, 250, 200, 50)方法设置组件的位置和大小。

将registerPanel和qrcodePanel添加到主面板panel中。

设置窗口可见

frame.add(panel);
frame.setVisible(true);
// 添加窗口事件监听器,以确保窗口获取焦点

使用add(panel)方法将主面板panel添加到窗口frame中。使用setVisible(true)方法将窗口设置为可见状态。

添加一个窗口事件监听器,以确保窗口获取焦点。

作者:FindYou.原文地址:https://blog.csdn.net/m0_74304371/article/details/134703603

%s 个评论

要回复文章请先登录注册