这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐选项的信息,请参阅JDK发行说明。
Java 2D API是强大且复杂的。然而,大多数使用Java 2D API的情况下只使用了其功能的一小部分,这些功能封装在java.awt.Graphics类中。本课程涵盖了应用程序开发人员最常见的需求。较少常见的需求在后面的Java 2D API高级主题中有描述。
Graphics类的大多数方法可以分为两个基本组:
例如,setFont和setColor方法定义了绘制和填充方法的呈现方式。
下图说明了这些方法与图形对象的关系:
绘制方法包括:
drawString - 用于绘制文本
g.drawString("你好", 10, 10);
drawImage - 用于绘制图像
g.drawImage(img,
0, 0, width, height,
0, 0, imageWidth, imageHeight,
null);
drawLine、drawArc、drawRect、drawOval、drawPolygon - 用于绘制几何形状
g2.draw(new Line2D.Double(0, 0, 30, 40));
根据当前的需求,可以根据以下标准在Graphics类中选择其中的一个方法:
填充方法适用于几何形状,包括fillArc、fillRect、fillOval、fillPolygon。
无论是绘制一行文本还是一个图像,在2D图形中,每个点都由其x和y坐标确定。所有绘制和填充方法都需要这些信息来确定文本或图像应该被渲染的位置。
例如,要绘制一条线,应用程序调用以下方法:
java.awt.Graphics.drawLine(int x1, int y1, int x2, int y2)
在这段代码中,(x1, y1)是线的起始点,(x2, y2)是线的终点。
绘制水平线的代码如下:
Graphics.drawLine(20, 100, 120, 100);
下面的演示累积了所有提到的技术。移动滑块以显示各种天气类型。
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);
}
...
setFont和drawString方法渲染了温度和天气条件。
...
// 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);
...
尝试修改WeatherWizard示例以更改图形内容。例如,可以使用fillRoundRect方法代替fillRect,或者在setFont方法中应用其他字体大小。在WeatherWizard.java文件中可以找到此应用程序的完整代码。该示例还需要以下图像:weather-cloud.png,weather-rain.png,weather-snow.png和weather-sun.png,它们位于images目录中。