12.5.1 Graphics类与图形绘制和组件重绘的处理

时间:2021-12-03 11:57:03

p { margin-bottom: 0.21cm; }a:link { }

  1. Graphics绘图

  • Component.getGraphics()返回一个包含Graphics类的包含组件屏幕显示对象Graphics类提供了显示图像,打印文字的一些方法

  • drawLine(int x1,int y1, int x2, int y2)在此图形上下文的坐标系中,使用当前颜色在点(x1, y1) (x2, y2)之间画一条线。

  • drawString(String str,int x, int y) 使用此图形上下文的当前字体和颜色绘制由指定string 给定的文本。

 

  1. 组件重绘的处理

  • 组件重绘的原理图形窗口每一次最小化后 系统就会在显卡中将组件清空而我们点击恢复按钮的时候,只是将窗口的组件重绘了出来 并没有将除了组件以外的其他任何东西存储起来这种现象称为曝光

  • paint(Graphicsg)的作用此里面保存的是窗口中的内容 每一次窗体恢复是AWT线程都会调用此方法

  • AWT线程的调用过程程序宜直接调用paint方法而需要通过java.awt.Component.repaint()方法调用

  • 每次调用repaint方法时此方法会自动调用update方法清除所有缓存 并调用paint方法我们就是在paint方法里面写恢复语句

  • 调用repaint方法的步骤

使用实例

 

 

h4 { margin-top: 0.49cm; margin-bottom: 0.51cm; line-height: 156%; page-break-inside: avoid; }h4.western { font-family: "Arial",sans-serif; font-size: 14pt; }h4.cjk { font-family: "黑体","SimHei"; font-size: 14pt; }h4.ctl { font-family: "DejaVu Sans"; font-size: 14pt; }p { margin-bottom: 0.21cm; }

实例DrawLine

/**

*Graphics类与图形绘制和组件重绘的处理

*此类完成一个直线的功能 并且最小化后自动恢复先前画的内容

**/

publicclassDrawLine extendsFrame {

intgetX;

intgetY;

intendX;

intendY;

VectorvLines= newVector();

//每一次清空缓存后调用的类此类为调用repaint方法后 repaint方法自动调用在此方法我们定义了集合类 画直线式在此集合类内部画的

@Override

publicvoidpaint(Graphics g) {

//TODOAuto-generated method stub

//g.drawLine(getX,getY, endX, endY);

Enumeratione = vLines.elements();

while(e.hasMoreElements()){

MyLineline = (MyLine)e.nextElement();

line.drawMe(g);

}

super.paint(g);

}

publicDrawLine() {

//TODOAuto-generated constructor stub

addWindowListener(newWindowAdapter(){

//内部匿名类定义一个window事件适配器关闭窗体

@Override

publicvoidwindowClosing(WindowEvent e) {

//TODOAuto-generated method stub

super.windowClosing(e);

e.getWindow().dispose();

System.exit(0);

}

});

//内部匿名类定义一个鼠标事件适配器

addMouseListener(newMouseAdapter(){

//鼠标按上的事件

@Override

publicvoidmousePressed(MouseEvent e) {

//TODOAuto-generated method stub

super.mousePressed(e);

getX= e.getX();

getY= e.getY();

}

//鼠标组件按下

@Override

publicvoidmouseReleased(MouseEvent e) {

//TODOAuto-generated method stub

endY=e.getY();

endX=e.getX();

super.mouseReleased(e);

//Graphicsg = getGraphics();

//g.setFont(newFont(null,Font.CENTER_BASELINE,20));

//g.setColor(Color.RED);

//g.drawString(getX+","+getY,getX, getY);

//g.drawString(e.getX()+","+e.getY(),e.getX(), e.getY());

//g.drawLine(getX,getY, e.getX(), e.getY());

//存储

vLines.add(newMyLine(getX,getY,endX,endY));

//每调用一个repaint方法他都会调用update方法 将所有内容擦出 并调用paint方法

//由于paint方法我们定义了将线条储存并画出来所以每画一次直线 直线都会被显示出来

repaint();

}

});

}

 

publicstaticvoidmain(String[] args) {

DrawLinedrawLine = newDrawLine();

drawLine.setSize(400,400);

drawLine.setVisible(true);

}

}

实例MyLine(绘制和重绘操作)

publicclassMyLine {

privateintgetX;

privateintgetY;

privateintendX;

privateintendY;

publicMyLine(intgetX, intgetY, intendX, intendY) {

super();

this.getX= getX;

this.getY= getY;

this.endX= endX;

this.endY= endY;

}

publicvoiddrawMe(Graphics g){

g.setColor(Color.RED);

g.drawString(getX+","+getY,getX,getY);

g.drawString(endX+","+endY,endX,endY);

g.drawLine(getX,getY,endX,endY);

}

}