老版的Graphics类就包含绘制直线、矩形和椭圆等方法,而且操作非常有限,如不能改变线的粗线,不能旋转这些图形。Java 2D库是一个功能强大的图形操作库。
要使用Java 2D库绘制图形,就需要获得一个Graphics2D类对象,它是Graphics类的子类。可以在paintComponent方法中强转获得一个Graphics2D的类对象:
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;
...
}
形状
Java2D采用面向对象的方式将几何图形组织起来。包含描述直线、矩形的椭圆的类:Line2D, Rectangle2D, Ellipse2D,这些类全部实现shape接口。 eg:
Rectangle2D floatRect = new Rectangle2D.Float(10.0f,25.0f,22.5f,20.0f);
Rectangle2D doubleRect= new Rectangle2D.Double(10.0f,25.0f,22.5f,20.0f);
Point2D p = new Point2D.Double(10,20);
Ellipse2D e = new Ellipse2D.Double(150,200,100,50);
设置矩形可以采用点设置的方式:
Rectangle2D = new Rectangle2D.Double();
rect.setFrameFromDiagonal(px,py,qx,qy);
也可以利用Point2D对象来设置:
rect.setFrameFromDiagonal(p,q);
颜色
使用Graphics2D类的setPaint方法可以为图形环境上的所有后续绘制操作选择颜色。eg:
g2.setPaint(Color.RED);
g2.drawString("Warning!",100,200);
将draw替换为fill可以用一种颜色填充一个封闭图形:
g2.fill(rect);
Color类用于定义颜色,JAVA中有13个预定义的常量,它们分别表示13种颜色:BLACK, BLUE, CYAN, DARK_GRAY, GRAY, GREEN, LIGHT_GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW。 也可以通过下面的函数获取:
Color(int redness, int greenness, int blueness)
Java在SystemColor类中预定义了很多颜色的名字,如:
p.setBackground(SystemColor.window);
Componet中可以设置背景和前景色:
MyComponent p = new MyComponent();
p.setBackground(Color.PINK);
p.setForeground(Color.WHITE);
Color中的brighter()和darker()方法可以设置加亮或变暗的效果:
Color c = new Color(123,123,123);
c.brighter().brighter().brighter();//多次调用达到耀眼的程度
字体
获取系统中的现有字体:
String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
for (String fontName : fontNames)
System.out.println(fontName);
AWT定义了5个逻辑字体:SansSerif, Serif, Monospaced, Dialog, DialogInput。
Oracle JDK定义了3种字体: Lucida Sans, Lucida Bright, Lucida Sans Typewriter
Font sansbold14 = new Font("SansSerif", Font.BOLD, 14);
g2.setFont(sansbold14);
String message = "Hello world";
g2.drawString(message,75, 100);
//得到字体属性的描述对象
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message,context);//得到包围字体的矩形框
图像的显示
Image img = new ImageIcon(filename).getImage();
public void paintComponent(Graphics g)
{
g.drawImage(image, x, y, null);
}