Java Swing 界面交互实战解析:窗口继承与事件监听
一、原题完整代码呈现
以下是计算机二级Java考试中关于Swing窗口设计、组件添加及事件处理的综合题型,主要考察类继承、容器组件管理、接口实现及事件方法重写,包含4处需要填写的空白(标记为//*********Found**********
):
import java.awt.event.*;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class Java_3
{
public static void main(String[] args)
{
FontFrame frame = new FontFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//*********Found**********
class FontFrame extends ________________
{
public FontFrame()
{
setTitle("北京 2008");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
FontPanel panel = new FontPanel();
Container contentPane = getContentPane();
//*********Found**********
contentPane.add(_____________________);
}
public static final int DEFAULT_WIDTH = 400;
public static final int DEFAULT_HEIGHT = 250;
}
class FontPanel extends JPanel
{
public FontPanel()
{
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
JButton redButton = new JButton("Green");
add(yellowButton);
add(blueButton);
add(redButton);
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction greenAction = new ColorAction(Color.GREEN);
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(greenAction);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
String message = "同一个世界,同一个梦想!";
Font f = new Font("隶书", Font.BOLD, 27);
g2.setFont(f);
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);
double x = (getWidth() - bounds.getWidth()) / 2;
double y = (getHeight() - bounds.getHeight()) / 2;
double ascent = -bounds.getY();
double baseY = y + ascent;
g2.setPaint(Color.RED);
g2.drawString (message, (int)x, (int)(baseY));
}
//*********Found**********
private class ColorAction ____________________ ActionListener
{
public ColorAction(Color c)
{
BackgroundColor = c;
}
//*********Found**********
public void _____________________ (ActionEvent event)
{
setBackground(BackgroundColor);
}
private Color BackgroundColor;
}
}
二、空白处逐一解析与解答
1. 第一处空白:FontFrame 继承的窗口类
答案:JFrame
//*********Found**********
class FontFrame extends JFrame
解析: FontFrame
是程序的主窗口类,需要具备窗口的基本功能(如设置标题、大小、关闭操作等)。Swing中顶级窗口的基类是JFrame
,通过继承JFrame
可直接复用其窗口管理功能,因此填写JFrame
。
2. 第二处空白:向内容面板添加面板组件
答案:panel
//*********Found**********
contentPane.add(panel);
解析: contentPane
是FontFrame
的内容面板(通过getContentPane()
获取),用于承载界面组件。前面已创建FontPanel panel
实例(自定义面板,包含按钮和绘图逻辑),需通过add()
方法将其添加到内容面板中才能显示,因此填写panel
。
3. 第三处空白:ColorAction 实现的事件接口
答案:implements
//*********Found**********
private class ColorAction implements ActionListener
解析: ColorAction
是处理按钮点击事件的内部类,需实现ActionListener
接口(Swing中处理动作事件的标准接口)。接口通过implements
关键字实现,因此填写implements
。
4. 第四处空白:重写的事件处理方法
答案:actionPerformed
//*********Found**********
public void actionPerformed (ActionEvent event)
解析: ActionListener
接口要求实现actionPerformed(ActionEvent event)
方法,该方法是事件处理的核心逻辑(当按钮被点击时触发)。此处需重写该方法以实现面板背景色的修改,因此填写actionPerformed
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序是一个具有交互功能的Swing界面,核心功能包括:
- 主窗口(
FontFrame
)显示标题“北京 2008”,包含一个自定义面板(FontPanel
) FontPanel
中:- 顶部显示居中的文本“同一个世界,同一个梦想!”(隶书、27号加粗、红色)
- 底部有三个按钮:Yellow(黄色)、Blue(蓝色)、Green(绿色)
- 点击按钮可切换面板的背景色(分别变为黄、蓝、绿色)
运行说明
程序启动后,显示一个400x250像素的窗口,标题为“北京 2008”:
- 窗口中央显示红色文本“同一个世界,同一个梦想!”
- 窗口底部有三个按钮横向排列
交互效果:
- 点击“Yellow”按钮:面板背景变为黄色
- 点击“Blue”按钮:面板背景变为蓝色
- 点击“Green”按钮:面板背景变为绿色
- 文本始终居中显示,不受背景色影响
- 退出方式:点击窗口右上角关闭按钮,程序正常退出
五、核心知识点总结
Swing窗口与面板的层次结构
- 顶级窗口:
JFrame
是独立窗口的基类,包含标题栏、边框和内容面板 - 内容面板:
JFrame
的getContentPane()
返回容器,所有组件需添加到该面板(而非直接添加到JFrame
) - 自定义面板:
JPanel
是轻量级容器,可重写paintComponent()
方法实现自定义绘图(如本题的文本绘制)
- 顶级窗口:
组件添加与布局
- 容器添加组件:通过
add(Component c)
方法将组件(如JPanel
、JButton
)添加到容器 - 默认布局:
JPanel
默认使用FlowLayout
(流式布局),组件按添加顺序横向排列(如三个按钮的排列方式) - 布局作用:控制组件在容器中的位置和大小,无需手动计算坐标
- 容器添加组件:通过
事件处理机制
核心角色:
- 事件源:产生事件的组件(如
JButton
) - 事件监听器:实现特定接口(如
ActionListener
)的对象,包含事件处理逻辑 - 注册监听:通过
addActionListener(Listener l)
将监听器绑定到事件源
- 事件源:产生事件的组件(如
- 工作流程:按钮被点击→触发
ActionEvent
→调用监听器的actionPerformed()
方法→执行背景色修改逻辑
内部类的应用
ColorAction
是FontPanel
的私有内部类,优势在于:- 可直接访问外部类的成员(如
setBackground()
方法) - 封装事件处理逻辑,使代码结构清晰
- 每个按钮对应一个
ColorAction
实例,通过构造方法传入目标颜色
- 可直接访问外部类的成员(如
自定义绘图
- 重写
paintComponent(Graphics g)
:Swing中自定义绘图的入口方法,需先调用super.paintComponent(g)
清除背景 - 绘图上下文:
Graphics2D
是Graphics
的子类,提供更丰富的绘图功能(如设置字体、计算文本边界) - 文本居中:通过
getStringBounds()
获取文本尺寸,结合面板大小计算居中坐标((宽度-文本宽)/2
,(高度-文本高)/2
)
- 重写
六、常见错误与应试技巧
常见错误分析
- 第一处空白继承类错误:写成
JPanel
(面板非窗口,无法独立显示)或Frame
(AWT类,非Swing) - 第二处空白添加对象错误:写成
contentPane.add(FontPanel)
(添加类而非实例,语法错误)或this.add(panel)
(直接向FontFrame
添加,不符合Swing规范) - 第三处空白接口实现错误:写成
extends
(extends
用于继承类,接口需用implements
) - 第四处空白方法名错误:写成
actionPerformed
以外的名称(如actionPerform
)或大小写错误(如ActionPerformed
),导致无法正确重写接口方法
- 第一处空白继承类错误:写成
应试技巧
- 窗口继承口诀:“主窗口继承JFrame,标题大小容易设,内容面板装组件”
- 事件处理:“按钮点击要响应,ActionListener来实现,actionPerformed重写好,注册监听不能少”
- 内部类使用:“事件逻辑内部类,访问外部真方便,颜色参数构造传,背景设置一键完”
- 绘图要点:“paintComponent重写它,super调用先执行,Graphics2D功能强,文本居中算坐标”
通过本题,我们掌握了Swing中窗口与面板的层次结构、组件添加、事件处理机制(接口实现与内部类)及自定义绘图的核心逻辑。这类综合题型融合了界面设计与交互逻辑,是Java桌面应用开发的基础,对理解事件驱动编程模型具有重要意义。