我们有时候需要在GUI组件上绘制图形,打印文字,显示图像等操作。组件对象本身不提供这些操作方法,它只提供了一个getGraphics方法,getGraphics方法返回一个包含有该组件的屏幕显示外观信息的Graphics类对象,Graphics类提供了在组件显示表面绘制图形,打印文字,显示图像等操作方法。如Graphics.drawLine(int x1,int y1,int x2,int y2)方法就是用来划线的,其中参数的意义也就不言而喻了。Graphics.drawString方法中的坐标是指整个文本块显示时的左下角位置。在GUI程序中仍然可以使用System.out.println()语句打印文本,只是打印的字符文本会显示在命令行窗口中。
下面学习下组件重绘,在组件大小改变或隐藏后又显示,AWT线程都会重新绘制组件,组件上原来绘制的图形也就不复存在了,这一个过程就叫曝光。AWT线程在重新绘制组件后,会立即调用组件的paint方法,所以我们的图形绘制代码应该在paint方法中编写。
Public void paint(Graphics g)当我们想要执行paint方法中的程序代码时,应用程序不应直接调用paint方法,如果想要执行paint方法中的程序代码,需调用Component.repaint方法,Component.repaint方法调用Component.update方法,Component.update方法再调用Component.paint方法。我们使用时需要定义一个继承了该组件的子类,在子类中覆盖paint方法,在新的paint中编写重绘图形程序代码,并将原先创建的组件对象改由这个组件创建,就可以达到我们的目的了。如:
public class RerawAllLine extends Frame //定义子类
{
Vector vLines=new Vector();
public static void main(String [] args)
{
RedrawAllLine f=new RedrawAllLine();
f.init();
}
public void paint(Graphics g) //覆盖paint方法
{
g.setColor(Color.red);
Enumeration e=vLines.elements();
while(e.hasMoreElements())
{
MyLine ln=(MyLine)e.nextElement();
ln.drawMe(g);
}
}
}
关于图像操作可以通过使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法在组件上显示图像,img参数是要显示的图像对象,x,y是图像的左上角坐标,observer是用于监视图像创建进度的一个对象。drawImage是一个异步方法,即使对于的图像没有完全加载,drawImage方法也会立即返回。如果程序想了解图像创建的进度信息,需要编写一个实现了ImageObserver接口的类,并将该类创建的对象传递给drawImage方法。