Java Swing QQ登录界面实现:从组件布局到事件监听

一、原题完整代码呈现
以下是Java Swing实现的模拟QQ登录界面程序,包含窗口设置、组件布局、事件监听等功能,涉及5处需要填写的空白(标记为//**********found**********):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//**********found**********
public class _________ extends JFrame {
private JTextField username;
private JPasswordField password;
private JLabel jl1;
private JLabel jl2;
private JLabel jl3;
private JLabel jl4;
private JButton bu1;
private JButton bu2;
private JButton bu3;
private JCheckBox jc1;
private JCheckBox jc2;
private JComboBox jcb;
public Java_3() {
this.setTitle("QQ2022正式版");
init();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置布局方式为绝对定位
this.setLayout(null);
this.setBounds(0, 0, 355, 265);
// 设置窗体的标题图标
Image image = new ImageIcon("a.png").getImage();
this.setIconImage(image);
// 窗体大小不能改变
this.setResizable(false);
// 居中显示
this.setLocationRelativeTo(null);
//**********found**********
this._______(true);
}
public void init() {
Container con = this.getContentPane();
jl1 = new JLabel();
// 设置背景图片
Image image1 = new ImageIcon("background.jpg").getImage();
jl1.setIcon(new ImageIcon(image1));
jl1.setBounds(0, 0, 355, 265);
jl2 = new JLabel();
Image image2 = new ImageIcon("a.gif").getImage();
jl2.setIcon(new ImageIcon(image2));
jl2.setBounds(40, 95, 50, 60);
//**********found**********
username = new ____________();
username.setBounds(50, 50, 150, 20);
jl3 = new JLabel("注册账号");
jl3.setBounds(210, 50, 70, 20);
password = new JPasswordField();
password.setBounds(50, 80, 150, 20);
jl4 = new JLabel("找回密码");
jl4.setBounds(210, 80, 70, 20);
jc1 = new JCheckBox("记住密码");
jc1.setBounds(125, 135, 80, 15);
jc2 = new JCheckBox("自动登录");
jc2.setBounds(215, 135, 80, 15);
jcb = new JComboBox();
jcb.addItem("在线");
jcb.addItem("隐身");
jcb.addItem("离开");
jcb.setBounds(40, 135, 55, 20);
bu1 = new JButton("登录");
bu1.setBounds(250, 200, 65, 20);
bu2 = new JButton("多账号");
bu2.setBounds(25, 200, 75, 20);
bu3 = new JButton("设置");
bu3.setBounds(140, 200, 65, 20);
bu3.addActionListener(new ActionListener() {
//**********found**********
public void ____________(ActionEvent e) {
if (jc1.isSelected()==true)
JOptionPane.showConfirmDialog(null,"确定记住密码吗?");
}
});
// 所有组件用容器装载
jl1.add(jl2);
jl1.add(jl3);
jl1.add(jl4);
jl1.add(jc1);
jl1.add(jc2);
jl1.add(jcb);
jl1.add(bu1);
jl1.add(bu2);
jl1.add(bu3);
con.add(jl1);
con.add(username);
con.add(password);
}
//**********found**********
public static void _________ (String[] args) {
Java_3 qq = new Java_3();
}
}二、空白处逐一解析与解答
1. 第一处空白:类名定义(继承JFrame)
答案:Java_3
//**********found**********
public class Java_3 extends JFrame {解析:
Java类名必须与构造方法名一致,代码中存在构造方法public Java_3(),因此类名必须为Java_3。该类继承JFrame,表示这是一个窗口类,用于创建GUI界面。
2. 第二处空白:设置窗口可见的方法
答案:setVisible
//**********found**********
this.setVisible(true);解析: JFrame的setVisible(boolean b)方法用于控制窗口是否可见。参数为true时窗口显示,false时隐藏。在初始化窗口后需调用此方法使窗口可见,因此填写setVisible。
3. 第三处空白:实例化用户名输入框
答案:JTextField
//**********found**********
username = new JTextField();解析: username的声明类型为JTextField(文本输入框),此处需创建其实例。JTextField用于接收用户输入的明文信息(如用户名),因此通过new JTextField()实例化,填写JTextField。
4. 第四处空白:ActionListener接口的事件处理方法
答案:actionPerformed
//**********found**********
public void actionPerformed(ActionEvent e) {解析: ActionListener接口要求实现actionPerformed(ActionEvent e)方法,该方法在事件触发时(如按钮点击)执行。此处为“设置”按钮添加点击事件处理,需重写该方法,因此填写actionPerformed。
5. 第五处空白:程序入口主方法名
答案:main
//**********found**********
public static void main (String[] args) {解析:
Java程序的入口是main方法,格式为public static void main(String[] args)。此处需定义主方法以启动程序,因此填写main。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序模拟QQ登录界面,实现以下功能:
- 创建标题为“QQ2022正式版”的窗口,固定大小(355×265),居中显示,不可调整大小;
- 界面包含:用户名输入框、密码输入框(密码隐藏)、“注册账号”和“找回密码”链接、“记住密码”和“自动登录”复选框、状态选择下拉框(在线/隐身/离开)、“登录”“多账号”“设置”按钮;
- 点击“设置”按钮时,若勾选“记住密码”,则弹出确认对话框;
- 窗口关闭时程序退出。
运行说明
界面布局:
- 背景图片:通过
jl1标签加载background.jpg作为背景; - 头像区域:
jl2标签加载a.gif作为头像; - 输入区域:
username(用户名,JTextField)和password(密码,JPasswordField)分别位于上方和中间; - 功能区域:复选框、下拉框和按钮按位置排列,通过
setBounds(x, y, width, height)设置绝对位置。
- 背景图片:通过
交互效果:
- 点击“设置”按钮:触发
actionPerformed方法,检查jc1(记住密码复选框)是否选中,若选中则显示“确定记住密码吗?”的确认对话框; - 窗口关闭:通过
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)设置关闭时退出程序。
- 点击“设置”按钮:触发
注意事项:
- 程序依赖图片文件(
a.png、background.jpg、a.gif),需确保这些文件与类文件在同一目录,否则图片无法显示; - 绝对定位(
setLayout(null))需手动设置每个组件的位置和大小,适合固定布局的界面。
- 程序依赖图片文件(
五、核心知识点总结
Swing窗口基础
- 类继承:通过
extends JFrame使自定义类成为窗口类,继承JFrame的所有属性和方法; 窗口设置:
setTitle(String title):设置窗口标题;setBounds(int x, int y, int width, int height):设置窗口位置和大小;setResizable(boolean resizable):设置窗口是否可调整大小(false为固定大小);setLocationRelativeTo(null):使窗口居中显示;setDefaultCloseOperation(int operation):设置窗口关闭操作(JFrame.EXIT_ON_CLOSE表示退出程序);setVisible(boolean b):控制窗口可见性(必须调用才会显示窗口)。
- 类继承:通过
Swing核心组件
JTextField:单行文本输入框,用于输入用户名等明文信息;JPasswordField:密码输入框,输入内容以圆点或星号显示,保护隐私;JLabel:标签组件,可显示文本或图片(通过setIcon(Icon icon)设置图片);JCheckBox:复选框,用于“记住密码”“自动登录”等可多选的选项(isSelected()判断是否选中);JComboBox:下拉选择框,用于选择状态(在线/隐身/离开),通过addItem(Object item)添加选项;JButton:按钮组件,用于触发操作(如“登录”“设置”)。
布局管理与组件定位
- 绝对定位:
setLayout(null)禁用默认布局,通过setBounds(x, y, width, height)手动设置组件位置(x,y为左上角坐标,width和height为宽高); - 容器层级:通过
Container con = getContentPane()获取内容面板,组件需添加到面板或其他容器(如jl1标签)中才能显示; - 组件添加:
add(Component comp)方法用于将组件添加到容器,添加顺序可能影响显示层级(后添加的组件可能覆盖先添加的)。
- 绝对定位:
事件监听机制
- 监听器注册:
bu3.addActionListener(new ActionListener(){...})为“设置”按钮注册动作监听器; - 事件处理:实现
ActionListener接口的actionPerformed(ActionEvent e)方法,编写按钮点击后的逻辑(此处判断复选框状态并显示对话框); - 对话框:
JOptionPane.showConfirmDialog(null, String message)显示确认对话框,用于简单交互。
- 监听器注册:
程序入口
- 主方法:
public static void main(String[] args)是程序入口,通过new Java_3()创建窗口实例,触发构造方法执行,完成界面初始化。
- 主方法:
六、常见错误与应试技巧
常见错误分析
- 第一处空白类名错误:写成
QQLogin等其他名称(必须与构造方法Java_3()一致,否则编译错误); - 第二处空白方法名错误:写成
setVisible()(多写括号,此处是方法调用,需带参数true,但空白处仅需方法名)或show(JFrame的show()方法已过时,推荐setVisible); - 第三处空白组件类型错误:写成
JTextArea(多行文本框,不适合输入用户名)或JPasswordField(与密码框重复,用户名需明文显示); - 第四处空白方法名错误:写成
actionPerform(拼写错误,正确为actionPerformed)或onClick(非ActionListener接口的方法); - 第五处空白方法名错误:写成
Main(Java区分大小写,必须小写main)或遗漏static(主方法必须静态)。
- 第一处空白类名错误:写成
应试技巧
- 类名与构造方法:“类名构造名相同,继承JFrame做窗口, extends关键字不能少”;
- 窗口可见性:“窗口创建后要显示,setVisible(true)来调用,参数true是关键”;
- 组件实例化:“文本输入用JTextField,密码用JPasswordField,new关键字来创建”;
- 事件处理:“按钮点击要响应,ActionListener来实现,方法名是actionPerformed”;
- 主方法格式:“程序入口是main,public static void不能改,String数组做参数”。
通过本题,我们掌握了Swing窗口创建、核心组件使用、绝对布局、事件监听及程序入口等知识点。这类题型是“Java GUI编程”的典型体现,实际开发中,除了绝对布局,还可使用FlowLayout、GridBagLayout等更灵活的布局管理器,同时需注意资源文件(如图片)的路径处理。