Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程

Java二级考试GUI绘图题解析:文字绘制与窗口布局

阿贵
1天前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2025年07月13日,已超过1天没有更新,若内容或图片失效,请留言反馈。

Java二级考试GUI绘图题解析:文字绘制与窗口布局

在计算机等级考试二级Java的综合应用题中,GUI编程和2D图形绘制是重要考点。本文将通过一道文字绘制的题目,详细解析JFrame窗口创建、自定义面板绘制以及文字渲染技术,帮助考生掌握这类题型的解答方法。

一、题目分析

9.png

题目要求

题目源代码:

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));
   }
}

程序功能:

  1. 创建一个显示"数风流人物,还看今朝!"的窗口
  2. 窗口标题为"沁园春.雪"
  3. 文字使用红色隶书,24号加粗字体
  4. 文字在面板中居中显示
  5. 补全指定位置的代码,不能修改已有代码

运行效果

  • 窗口标题:"沁园春.雪"
  • 窗口内容:居中显示红色文字"数风流人物,还看今朝!"
  • 窗口大小: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. 文本精确绘制

  1. 字体设置

    Font f = new Font("隶书", Font.BOLD, 24);
    g2.setFont(f);
  2. 文本测量

    FontRenderContext context = g2.getFontRenderContext();
    Rectangle2D bounds = f.getStringBounds(message, context);
  3. 居中计算

    double x = (getWidth() - bounds.getWidth()) / 2;
    double y = (getHeight() - bounds.getHeight()) / 2;
  4. 基线对齐

    double ascent = -bounds.getY();
    double baseY = y + ascent;

五、常见错误分析

  1. 继承关系错误

    • 混淆JFrame和JPanel的使用场景
    • 自定义面板错误继承JFrame
  2. 绘制方法覆盖不当

    • 忘记调用super.paintComponent()
    • 错误覆盖paint()而不是paintComponent()
  3. 坐标计算错误

    • 直接使用y坐标忽略基线
    • 未考虑字体度量信息
  4. 资源管理问题

    • 未设置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");

七、考试技巧

  1. GUI程序结构

    • 记住JFrame和JPanel的分工
    • 内容面板必须通过getContentPane()获取
  2. 绘制流程

    • paintComponent方法签名要正确
    • 必须先调用父类方法
  3. 文本绘制要点

    • 设置字体
    • 计算居中位置
    • 考虑基线对齐
  4. 代码补全技巧

    • 根据上下文推断缺失代码
    • 注意变量作用域
    • 记住常用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);
   }
}

答案

  1. MyPanel
  2. Color.BLUE
  3. getFontMetrics

九、总结

通过这道GUI绘图题,我们掌握了:

  1. Swing窗口程序的基本结构
  2. 自定义JPanel绘制的方法
  3. 文本精确绘制和居中显示技术
  4. Graphics2D的基本使用方法

关键点记忆

  • JFrame用于创建窗口,JPanel用于自定义绘制
  • 绘制必须覆盖paintComponent方法
  • 文本居中需要考虑字体度量
  • drawString是绘制文本的核心方法

掌握这些知识不仅有助于通过Java二级考试,也为开发图形界面程序打下坚实基础。希望这篇解析能帮助你在考试中取得好成绩!

喜欢就支持一下吧
点赞 1 分享 收藏
评论 抢沙发
OωO
取消 登录评论