`
abalone
  • 浏览: 130653 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

图形程序设计

    博客分类:
  • java
阅读更多
http://hi.baidu.com/filoplume/blog/item/8201f9dda3e701dc8d1029bb.html

字体 

可以通过一个字体名(font face name)指定一种字体。字体名由"Helvetica"这样的字体家族名(font family name)和一个可选的"Bold"后缀组成。例如"Helvetica"和"Helvetica Bold"属于"Helvetica"家族的字体。

要想知道某台特定计算机上所允许使用的字体,就需要调用Graphics Environment类中的getAvailableFontFamilyNames方法,这个方法将返回一个String型数组,其中包含了所有可用的字体名。

GraphicsEnvironment类描述了用户系统的图形环境,为了得到这个类的对象,需要调用静态的getLocalGraphicsEnvironment方法。下列的程序将打印出系统上所有字体名:

//v1ch7\ListFonts.java

import java.awt.*;

public class ListFonts
{
   public static void main(String[] args)
   {
      String[] fontNames = GraphicsEnvironment
         .getLocalGraphicsEnvironment()
         .getAvailableFontFamilyNames();

      for (String fontName : fontNames)
         System.out.println(fontName);
   }
}
无法知道用户是否安装了某种特定外观的字体。此外,一些字体还有仿制品。为了创建一个公共基准,AWT定义了5个落体字体名:SansSerif, serif, Monospaced, Dialog, DialogInput。这些字体将被映射到客户机上的实际字体。比如在Windows系统中,SansSerif将被映射到Arial上。

要想使用某种字体绘制字符,必须首先利用指定的字体名、字体风格和字体大小来创建一个Font类对象。下面是构造一个Font对象的例子: Font helvb14 = new Font("Helvetica", Font.BOLD, 14);
Font构造器中,第一个参数提供字体名,可以用逻辑字体。另外第二个参数可以指定字体的风格(常规,加粗,斜体,加粗斜体),下面是几个字体风格的值:
Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD + Font.ITALIC

JDK1.3开始,可以读取TrueType字体,这需要一个字体输入流,可以从文件或者URL读取,最后调用静态方法Font.createFont:
URL url = new URL(http://www.fonts.com.Wingbats.ttf);
InputStream in = url.openStream();
Font f = Font.createFont(Font.TRUERYPE_FONT, in);
上面定义的字体是常规字体,大小为1。可以使用deriveFont方法定义字体的大小:
Font df = f.deriveFont(14.0F);
deriveFont(float f) 设置字体大小
deriveFont(int i) 设置字体风格 //deriveFont(14)设置风格为斜体

我们希望把字符串绘制在面板的中央,怎么办?需要知道字符串占据的宽和高的像素数量,这取决于这些:
·使用的字体
·字符串
·绘制字体的设备
要想得到屏幕设备字体属性的描述对象,需要调用Graphics2D类的getFontRenderContext方法,返回FontRenderContext类对象,可以直接把这个对象传递给Font类的getStringBounds方法:
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);


为了解释这个矩形,需要清楚几个术语。基线(baseline)是一条虚构的线。上坡度(ascent)是从基线到坡顶(ascenter)的距离。下坡度是从基线到坡底的距离。
行间距(leading)是某一行的坡底与其下一行的坡顶之间的空隙。字体的高度是连续两个基线的距离,它等于下坡度+行间距+上坡度。
getStringBounds方法返回的举行宽度是字符串水平方向的宽度。矩形的高度是上坡度、下坡度、行间距的总和。该矩形始于字符串的基线,矩形顶部的y坐标为负值。因此,可以采用下面的方法获得字符串的宽度、高度和上坡度。
double stringWidth = bounds.getWidth();
double stringHeight = bounds.getHeight();
double ascent = -bounds.getY();
如果需要知道下坡度或行间距,可以使用Font类的getLineMetrics方法。这个方法将返回一个LineMetrics类对象,获得下坡度和行间距的方法是:
LineMetrics metrics = f.getLineMetrics(message, context);
float descent = metrics.getDescent();
float leading = metrics.getLeading();

这个代码使用了这些信息可以把字符串显示在包围它的面板中央:
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);
//(x, y) = top left corner of text
double x = (getWidth() - bounds.getWidth())/2;
double y = (getHeight() - bounds.getHeight())/2;
double ascent = -bounds.getY();
double baseY = y + ascent;
g2.drawString(message, (int)x, (int)baseY);

java.awt.Font
·Font(String name, int style, int size)
   name 字体名或者逻辑字体名
   style 字体风格
   size 字体大小
·String getFontName() 返回字体名
·String getFamily() 返回字体家族名
·String getName() 返回字体名。如果创建时候使用了逻辑字体,就返回逻辑名
·Rectangle2D getStringBounds(String s, FontRenderContext context)
·LineMetrics getLineMetrics(String s, FontRenderContext context)
·Font deriveFont(int style)
·Font deriveFont(float size)
·Font deriveFont(int style, float size)

java.awt.font.LineMetrics
·float getAscent() 上坡度
·float getDescent() 下坡度
·float getLeading() 行间距——从一行文本底端到下一行文本顶端之间的空隙
·float getHeight() 返回字体的总高度,两条基线的距离 下坡度+行间距+上坡度

java.awt.Graphics
·void setFont(Font font)
·void drawString(String str, int x, int y)

java.awt.Graphics2D
·FontRenderContext setRenderContext()
·void drawString(String str, int x, int y)

//v1ch7\FontTest.java

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;

public class FontTest
{
   public static void main(String[] args)
   {
      FontFrame frame = new FontFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

/**
   A frame with a text message panel
*/
class FontFrame extends JFrame
{
   public FontFrame()
   {
      setTitle("FontTest");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      // add panel to frame

      FontPanel panel = new FontPanel();
      add(panel);
   }

   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;
}

/**
   A panel that shows a centered message in a box.
*/
class FontPanel extends JPanel
{
   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;

      String message = "Hello, World!";

      Font f = new Font("Serif", Font.BOLD, 36);
      g2.setFont(f);

      // measure the size of the message

      FontRenderContext context = g2.getFontRenderContext();
      Rectangle2D bounds = f.getStringBounds(message, context);

      // set (x,y) = top left corner of text

      double x = (getWidth() - bounds.getWidth()) / 2;
      double y = (getHeight() - bounds.getHeight()) / 2;

      // add ascent to y to reach the baseline

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

      // draw the message

      g2.drawString(message, (int) x, (int) baseY);

      g2.setPaint(Color.GRAY);

      // draw the baseline

      g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));

      // draw the enclosing rectangle

      Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
      g2.draw(rect);
   }
}


分享到:
评论

相关推荐

    C++大作业三维图形程序设计源码.zip

    C++大作业三维图形程序设计源码.C++大作业三维图形程序设计源码.C++大作业三维图形程序设计源码.C++大作业三维图形程序设计源码.C++大作业三维图形程序设计源码.C++大作业三维图形程序设计源码.C++大作业三维图形...

    GDI+图形程序设计

    《GDI+图形程序设计》是一本专注于GDI+绘图技术的专业书籍,对于开发者来说,它是探索Windows图形编程领域的宝贵资源。GDI+(Graphics Device Interface Plus)是微软为Windows应用程序提供的一种强大的图形处理库,...

    C与C++高级图形程序设计完整版

    C与C++高级图形程序设计完整版 内容摘要: 附录与关键词: 计算机图形学 程序设计 程序设计 计算机图形学 全文目录 目录 为什么要阅读本书 前言 第一章 数学模块 鸣谢 第一部 分通用程序 第二章 图形界面模块 第三章 ...

    visual basic图形程序设计

    《Visual Basic图形程序设计》是一本深入浅出的教程,主要针对初学者和希望进一步提升VB编程技能的读者。Visual Basic(简称VB)是Microsoft公司推出的一种基于事件驱动的编程语言,尤其适合进行图形用户界面(GUI)...

    DirectX 3D图形程序设计pdf 和源码

    估计很多人看过一本叫做3D游戏从头编.chm 的电子书,如果你看了我的这个资源,你会发现,那个3D游戏从头编.chm的电子书完全是我这个资源的开篇部分并且是缺少了很多代码的解释,DirectX 3D图形程序设计 这本书很适合...

    《OpenGL图形程序设计指南》源代码.rar

    该资源包括了《OpenGL图形程序设计指南》这本书中的所有例子的源代码,特别适合初学者自学所用。

    GDI+图形程序设计.zip

    这本书《GDI+程序设计》显然是一个深入探讨GDI+技术的教程,它可能包含了GDI+的基础概念、核心组件、实例解析和实践代码。通过阅读这本书,开发者可以了解到如何利用GDI+来构建图形用户界面,进行图像处理,以及创建...

    C# GDI+图形程序设计》随书源码完整版 加电子书 1

    C# GDI+图形程序设计》随书源码完整版 总共2个压缩文件,共100多MB,这是第一个

    Visual C#图形程序设计实例

    Visual C#图形程序设计实例 pdf格式

    C# GDI+图形程序设计源代码

    C# GDI+图形程序设计源代码 C#图形设计的一些源码 学C#必须研究的

    C# GDI+图形程序设计》随书源码完整版 加电子书 2

    C# GDI+图形程序设计》随书源码完整版 加电子书 2 总共2个压缩包,这是第2个,需要下载2个压缩包,才可以解压,因为一次最多可以上传70MB,所以分2次上传了,给你带来不便,望谅解!

    《C# GDI+图形程序设计》随书源码完整版

    《C# GDI+图形程序设计》是一本深入探讨C#中使用GDI+进行图形绘制和用户界面设计的专业书籍。GDI+是.NET Framework的一部分,它提供了丰富的图形处理功能,包括绘制线条、曲线、形状、文本以及图像操作等。本书的随...

    GDI+图形程序设计_Mahesh_Chand

    《GDI+图形程序设计》GDI+是新一代的...《GDI+图形程序设计》是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。

    C与C++高级图形程序设计完整版2

    C与C++高级图形程序设计完整版

    GDI+图形程序设计.7z

    GDI+图形程序设计》GDI+是新一代的图形...《GDI+图形程序设计》是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。

    OpenGL图形程序设计与应用环境

    OpenGL图形程序设计与应用环境,高清电子书,高清电子书签。OpenGL图形程序设计与应用环境,高清电子书,高清电子书签。

    GDI+图形程序设计_中文版_[美] Mahesh Chand ,文中用C#示例

    《GDI+图形程序设计》GDI+是新一代的...《GDI+图形程序设计》是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面。

    VC++图形程序设计基础

    【VC++图形程序设计基础】是面向初学者的教程,主要涵盖了如何在Visual C++ 6.0环境下进行图形程序的设计。Visual C++是Microsoft公司推出的一种集成开发环境,它结合了编辑、编译、运行和调试等功能,使得开发者...

    C 和 C++ 图形程序设计基础.zip

    C 和 C++ 图形程序设计基础.zip

Global site tag (gtag.js) - Google Analytics