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

本文介绍了Graphics类在Java中用于图形绘制的方法,如drawLine和drawString,并探讨了组件重绘的原理及处理方式。通过DrawLine类和MyLine类的实例,展示了如何实现图形的绘制和恢复。当窗体最小化后再恢复时,通过覆盖paint方法和使用repaint机制,可以确保先前的图形内容得以重新显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(Graphics g) 的作用 此里面保存的是窗口中的内容 每一次窗体恢复是 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 类与图形绘制和组件重绘的处理

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

* */

public class DrawLine extends Frame {

int getX ;

int getY ;

int endX ;

int endY ;

Vector vLines = new Vector();

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

@Override

public void paint(Graphics g) {

// TODO Auto-generated method stub

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

Enumeration e = vLines .elements();

while (e.hasMoreElements()){

MyLine line = (MyLine)e.nextElement();

line.drawMe(g);

}

super . paint (g);

}

public DrawLine() {

// TODO Auto-generated constructor stub

addWindowListener( new WindowAdapter(){

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

@Override

public void windowClosing(WindowEvent e) {

// TODO Auto-generated method stub

super .windowClosing(e);

e.getWindow().dispose();

System. exit (0);

}

});

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

addMouseListener( new MouseAdapter(){

// 鼠标按上的事件

@Override

public void mousePressed(MouseEvent e) {

// TODO Auto-generated method stub

super .mousePressed(e);

getX = e.getX();

getY = e.getY();

}

// 鼠标组件按下

@Override

public void mouseReleased(MouseEvent e) {

// TODO Auto-generated method stub

endY =e.getY();

endX =e.getX();

super .mouseReleased(e);

// Graphics g = getGraphics();

// g.setFont(new Font(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( new MyLine( getX , getY , endX , endY ));

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

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

repaint();

}

});

}

 

public static void main(String[] args) {

DrawLine drawLine = new DrawLine();

drawLine.setSize(400, 400);

drawLine.setVisible( true );

}

}

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

public class MyLine {

private int getX ;

private int getY ;

private int endX ;

private int endY ;

public MyLine( int getX, int getY, int endX, int endY) {

super ();

this . getX = getX;

this . getY = getY;

this . endX = endX;

this . endY = endY;

}

public void drawMe(Graphics g){

g.setColor(Color. RED );

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

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

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

}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值