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
等更灵活的布局管理器,同时需注意资源文件(如图片)的路径处理。