Java二级考试GUI绘图题解析:文字绘制与窗口布局
在计算机等级考试二级Java的综合应用题中,GUI编程和2D图形绘制是重要考点。本文将通过一道文字绘制的题目,详细解析JFrame窗口创建、自定义面板绘制以及文字渲染技术,帮助考生掌握这类题型的解答方法。
一、题目分析
题目要求
题目源代码:
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 _________ JFrame
{
public FontFrame()
{
setTitle("沁园春.雪");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
FontPanel panel = new FontPanel();
Container contentPane = getContentPane();
//*********Found********
contentPane.add(___________________);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
//*********Found********
class FontPanel extends ________
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
String message = "数风流人物,还看今朝!";
Font f = new Font("隶书", Font.BOLD, 24);
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);
//*********Found********
g2._________________(message, (int)x, (int)(baseY));
}
}
程序功能:
- 创建一个显示"数风流人物,还看今朝!"的窗口
- 窗口标题为"沁园春.雪"
- 文字使用红色隶书,24号加粗字体
- 文字在面板中居中显示
- 补全指定位置的代码,不能修改已有代码
运行效果
- 窗口标题:"沁园春.雪"
- 窗口内容:居中显示红色文字"数风流人物,还看今朝!"
- 窗口大小:300×200像素
二、解题思路与填空详解
第一个填空位置
class FontFrame _________ JFrame
需要填入:类继承关系
正确答案:extends
解释:
- 自定义窗口类需要继承JFrame
- 从上下文可见使用了JFrame的方法(setTitle, setSize等)
- 这是创建自定义窗口的标准做法
第二个填空位置
contentPane.add(___________________);
需要填入:添加到内容面板的组件
正确答案:panel
解释:
- 前面已创建FontPanel实例:
FontPanel panel = new FontPanel();
- 需要将面板添加到窗口的内容面板中
- 这是Swing程序的标准做法
第三个填空位置
class FontPanel extends ________
需要填入:面板类的父类
正确答案:JPanel
解释:
- 自定义绘制组件通常继承JPanel
- 需要覆盖paintComponent方法进行自定义绘制
- JPanel提供了双缓冲等绘图优化
第四个填空位置
g2._________________(message, (int)x, (int)(baseY));
需要填入:绘制字符串的方法
正确答案:drawString
解释:
- Graphics2D绘制文本的标准方法
- 参数为(字符串, x坐标, y坐标)
- y坐标使用baseY确保正确基线对齐
三、完整正确代码
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);
}
}
class FontFrame extends JFrame {
public FontFrame() {
setTitle("沁园春.雪");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
FontPanel panel = new FontPanel();
Container contentPane = getContentPane();
contentPane.add(panel);
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
class FontPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
String message = "数风流人物,还看今朝!";
Font f = new Font("隶书", Font.BOLD, 24);
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));
}
}
四、关键知识点解析
1. Swing窗口创建
JFrame:顶级窗口容器
setTitle()
设置窗口标题setSize()
设置窗口大小setDefaultCloseOperation()
设置关闭行为
内容面板:通过
getContentPane()
获取- 使用
add()
方法添加组件
- 使用
2. 自定义绘制
JPanel:通用绘制面板
- 覆盖
paintComponent()
进行自定义绘制 - 必须先调用
super.paintComponent(g)
- 覆盖
Graphics2D:增强的绘图对象
- 提供文本、形状、图像等绘制功能
- 可以设置字体、颜色、变换等属性
3. 文本精确绘制
字体设置:
Font f = new Font("隶书", Font.BOLD, 24); 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;
五、常见错误分析
继承关系错误:
- 混淆JFrame和JPanel的使用场景
- 自定义面板错误继承JFrame
绘制方法覆盖不当:
- 忘记调用super.paintComponent()
- 错误覆盖paint()而不是paintComponent()
坐标计算错误:
- 直接使用y坐标忽略基线
- 未考虑字体度量信息
资源管理问题:
- 未设置EXIT_ON_CLOSE
- 忘记显示窗口(setVisible(true))
六、扩展思考
1. 字体可用性处理
// 检查字体是否可用
String[] fonts = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
// 回退字体方案
Font f;
try {
f = new Font("隶书", Font.BOLD, 24);
} catch (Exception e) {
f = new Font(Font.SERIF, Font.BOLD, 24);
}
2. 抗锯齿渲染
g2.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
3. 国际化支持
// 使用资源束
ResourceBundle bundle = ResourceBundle.getBundle("Messages");
String message = bundle.getString("poem.line");
七、考试技巧
GUI程序结构:
- 记住JFrame和JPanel的分工
- 内容面板必须通过getContentPane()获取
绘制流程:
- paintComponent方法签名要正确
- 必须先调用父类方法
文本绘制要点:
- 设置字体
- 计算居中位置
- 考虑基线对齐
代码补全技巧:
- 根据上下文推断缺失代码
- 注意变量作用域
- 记住常用API方法名
八、模拟练习
题目:补全显示蓝色居中文字的窗口程序
import java.awt.*;
import javax.swing.*;
public class DrawingTest {
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class MyFrame extends JFrame {
public MyFrame() {
setTitle("文字绘制");
setSize(400, 300);
//*********Found********
____________________ panel = new MyPanel();
getContentPane().add(panel);
}
}
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
//*********Found********
g2.setColor(___________);
Font f = new Font("宋体", Font.PLAIN, 20);
g2.setFont(f);
String text = "Java二级考试";
//*********Found********
FontMetrics fm = g2.___________();
int x = (getWidth() - fm.stringWidth(text)) / 2;
int y = (getHeight() - fm.getHeight()) / 2 + fm.getAscent();
g2.drawString(text, x, y);
}
}
答案:
MyPanel
Color.BLUE
getFontMetrics
九、总结
通过这道GUI绘图题,我们掌握了:
- Swing窗口程序的基本结构
- 自定义JPanel绘制的方法
- 文本精确绘制和居中显示技术
- Graphics2D的基本使用方法
关键点记忆:
- JFrame用于创建窗口,JPanel用于自定义绘制
- 绘制必须覆盖paintComponent方法
- 文本居中需要考虑字体度量
- drawString是绘制文本的核心方法
掌握这些知识不仅有助于通过Java二级考试,也为开发图形界面程序打下坚实基础。希望这篇解析能帮助你在考试中取得好成绩!