类:图形入门

Java 2D API 既强大又复杂。但是,Java 2D API 的绝大多数用途都利用了封装在java.awt.Graphics类中的功能的一小部分。本类涵盖了应用程序开发人员最常见的需求。不太常见的需求将在Java 2D API 中的高级主题中描述。

Graphics类的大多数方法可以分为两个基本组:

  • 绘制和填充方法,使您可以渲染基本形状,文本和图像

  • 属性设置方法,这些方法会影响图形和填充的外观

setFontsetColor之类的方法定义了 draw 和 fill 方法的呈现方式。

该图说明了这些方法如何与图形对象相关:

该图表示 Graphics 类的基本方法

绘制方法包括:

  • drawString –用于绘制 Literals
g.drawString("Hello", 10, 10);
  • drawImage –用于绘制图像
g.drawImage(img, 
            0, 0, width, height,
            0, 0, imageWidth, imageHeight,
            null);
  • drawLinedrawArcdrawRectdrawOvaldrawPolygon –用于绘制几何形状
g2.draw(new Line2D.Double(0, 0, 30, 40));

根据您当前的需要,您可以根据以下条件在Graphics类中选择几种方法之一:

  • 是否要以原始大小在指定位置渲染图像或将其缩放以适合给定矩形

  • 您是要用彩色填充图像的透明区域还是使它们保持透明

填充方法适用于几何形状,包括fillArcfillRectfillOvalfillPolygon

无论是绘制文本行还是图像行,请记住,在 2D 图形中,每个点都由其 x 和 y coordinates确定。所有的绘制和填充方法都需要此信息,该信息确定应在何处呈现文本或图像。

例如,要画一条线,应用程序将调用以下命令:

java.awt.Graphics.drawLine(int x1, int y1, int x2, int y2)

在此代码中,*(x1,y1)是直线的起点,而(x2,y2)*是直线的 endpoints。

因此,绘制水平线的代码如下:

Graphics.drawLine(20, 100, 120, 100);

下面的演示积累了所有提到的技术。移动滑块以显示各种天气类型。

Note:

如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)7版本。

WeatherWizard演示使用JSlider组件以及各种图形功能来生成和显示指定的天气类型。有关JSlider类的更多信息,请参见 Swing 教程的如何使用滑块部分。

WeatherPainter类的paint方法实现了图形功能。以下代码绘制使用setupWeatherReport()方法确定的图像。

...
origComposite = g2.getComposite();
if (alpha0 != null) g2.setComposite(alpha0);
g2.drawImage(img0,
             0, 0, size.width, size.height,
             0, 0, img0.getWidth(null),
             img0.getHeight(null), null);
if (img1 != null) {
    if (alpha1 != null) g2.setComposite(alpha1);
    g2.drawImage(img1,
                 0, 0, size.width, size.height,
                 0, 0, img1.getWidth(null),
                 img1.getHeight(null), null);
} 
...

setFontdrawString方法呈现温度和天气状况。

...
// Freezing, Cold, Cool, Warm, Hot,
// Blue, Green, Yellow, Orange, Red
Font font = new Font("Serif", Font.PLAIN, 36);
g.setFont(font);
        
String tempString = feels + " " + temperature+"F";
FontRenderContext frc =
           ((Graphics2D)g).getFontRenderContext();
...
g.setColor(textColor);
int xTextTemp = rX-(int)boundsTemp.getX();
int yTextTemp = rY-(int)boundsTemp.getY();
g.drawString(tempString, xTextTemp, yTextTemp);
        
int xTextCond = rX-(int)boundsCond.getX();
int yTextCond = rY-(int)boundsCond.getY()
                   + (int)boundsTemp.getHeight();
g.drawString(condStr, xTextCond, yTextCond);

fillRect方法允许您绘制一个填充有指定颜色的矩形。

...
Rectangle2D boundsTemp 
          = font.getStringBounds(tempString, frc);
Rectangle2D boundsCond 
          = font.getStringBounds(condStr, frc);
int wText = Math.max((int)boundsTemp.getWidth(),
            (int)boundsCond.getWidth());
int hText = (int)boundsTemp.getHeight()
            + (int)boundsCond.getHeight();
int rX = (size.width-wText)/2;
int rY = (size.height-hText)/2;
        
g.setColor(Color.LIGHT_GRAY);
g2.fillRect(rX, rY, wText, hText);
...

try修改WeatherWizard演示以更改图形内容。例如,使用fillRoundRect方法而不是fillRect或在setFont方法中应用其他字体大小。在WeatherWizard.java文件中找到此 applet 的完整代码。该演示还需要以下图像:images目录中的weather-cloud.pngweather-rain.pngweather-snow.pngweather-sun.png