展开全部

谈谈java.awt.Graphics类

图形环62616964757a686964616fe59b9ee7ad9431333233663438境的概念同在 GUI 平台上开发应用程序紧密相关。虽然通常将窗口和组件本身作为对象来表达,但仍然需要另一个接口来执行实际的绘制、着色以及文本输出操作。Java 语言中提供这些功能的基类称作 java.awt.Graphics。从 java.awt.Component 类(所有窗口对象的基类)继承的类提供了一个名为 paint() 的方法,在需要重新绘制组件时,调用该方法。

paint() 方法只有一个参数,该参数是 Graphics 类的实例。

Graphics 类支持几种确定图形环境状态的特性。以下列出了部分特性:

1.Color:当前绘制颜色,它属于 java.awt.Color 类型。所有的绘制、着色和纯文本输出都将以指定的颜色显示。

2.Font:当前字体,它属于 java.awt.Font 类型。它是将用于所有纯文本输出的字体。

3.Clip:java.awt.Shape 类型的对象,它充当用来定义几何形状的接口。该特性包含的形状定义了图形环境的区域,绘制将作用于该区域。通常情况下,这一形状与整个图形环境相同,但也并不一定如此。

4.ClipBounds:java.awt.Rectangle 对象,它表示将包围由 Clip 特性定义的 Shape 的最小矩形。它是只读特性。

5.FontMetrics:java.awt.FontMetrics 类型的只读特性。该对象含有关于图形环境中当前起作用的 Font 的信息。

6.Paint Mode:该特性控制环境使用当前颜色的方式。如果调用了 setPaintMode() 方法,那么所有绘制操作都将使用当前颜色。如果调用了 setXORMode() 方法(该方法获取一个 Color 类型的参数),那么就用指定的颜色对像素做“XOR”操作。XOR 具有在重新绘制时恢复初始位模式的特性,因此它被用作橡皮擦除和动画操作。

Graphics 类方法:

可以将 java.awt.Graphics 支持的非特性方法划分为三个常规类别之下:

1.跟踪形状轮廓的绘制方法:

draw3DRect() drawArc() drawBytes() drawChars()

drawImage() drawLine() drawOval() drawPolygon()

drawPolyline() drawRect() drawRoundRect() drawString()

2.填充形状轮廓的绘制方法:

fill3DRect() fillArc() fillOval()

fillPolygon() fillRect() fillRoundRect()

3.诸如 translate() 之类的杂项方法,它们将图形环境的起点从其缺省值 (0,0) 变成其它值。

请注意,没有对任意形状进行操作的操作。直到 Java 2D 出现以前,图形操作一直都是很有局限性的。还需注意的是,对于渲染具有属性的文本也没有直接支持;显示格式化文本是一项费事的任务,需要手工完成。

下面我们来看一些具体的实例(注:所有的实例都没有加上关闭窗口的事件驱动,只能用Ctrl+C来中断程序):

1.画线程序:

import java.awt.*;

import java.awt.event.*;

import java.util.*;

class Main extends Frame {

Vector points = new Vector();

int lastDrawnPoint = 0;

Main() {

super("drawLine Example");

setSize(200, 200);

addMouseListener(new MouseEventHandler());

addMouseMotionListener(new MouseMotionEventHandler());

show();

}

public void paint(Graphics g) {

Point curPt = null;

for (int i=0; i Point pt = (Point)points.elementAt(i);

if (curPt != null) {

g.drawLine(curPt.x, curPt.y, pt.x, pt.y);

}

curPt = pt;

}

lastDrawnPoint = points.size();

}

public void update(Graphics g) {

Point curPt = null;

lastDrawnPoint = Math.max(0, lastDrawnPoint-1);

for (int i=lastDrawnPoint; i Point pt = (Point)points.elementAt(i);

if (curPt != null) {

g.drawLine(curPt.x, curPt.y, pt.x, pt.y);

}

curPt = pt;

}

lastDrawnPoint = points.size();

}

class MouseEventHandler extends MouseAdapter {

public void mousePressed(MouseEvent evt) {

points.addElement(evt.getPoint());

repaint();

}

}

class MouseMotionEventHandler extends MouseMotionAdapter {

public void mouseDragged(MouseEvent evt) {

points.addElement(evt.getPoint());

repaint();

}

}

static public void main(String[] args) {

new Main();

}

}

Graphics.drawLine(int x,int y,int x2,int y2);是从一个点的坐标到另一个点的坐标。

这个实例的运行结果也就是可以任意的画线。可以任意的拖动鼠标,我们知道,线都是由点构成的。我们的主程序是继承java.awt.Frame这个类,重载了paint()和update()这两个方法。而在主类添加了两个事件new MouseEventHandler()和MouseMotionEventHandler()。当我们运行程序结果时就能知道,paint()只是最初的调用,以后都是调用update(),而在MouseEventHandler()和MouseMotionEventHandler()中调用repaint()也是sun的程序员在内部已经嵌入的,所以这个不是我们需要担心的,程序的原理我想大家都明白的,用一个向量来保存鼠标的点,lastDrawnPoint是一个重要的变量,然后就不说了。

2.调用图片程序:

import java.awt.*;

class Main extends Frame {

Image image;

Main(String filename) {

super("drawImage Example");

try {

image = getToolkit().getImage(filename);

setIconImage(image);

} catch (Exception e) {

e.printStackTrace();

}

setSize(400, 200);

show();

}

public void paint(Graphics g) {

Insets insets = getInsets();

int x = insets.left, y = insets.top;

int w = image.getWidth(this);

int h = image.getHeight(this);

// original

g.drawImage(image, x, y, this);

// shrinken

g.drawRect(x, y, w/4+1, h/4+1);

g.drawImage(image, x+1, y+1, w/4, h/4, this);

// horizontally flipped

g.drawImage(image, x+w, y, x+2*w, y+h, w, 0, 0, h, this);

// vertically flipped

g.drawImage(image, x+2*w, y, x+3*w, y+h, 0, h, w, 0, this);

// enlarged; use -1 to indicate proportional height

g.drawImage(image, x+3*w, y, 2*w, -1, this);

}

static public void main(String[] args) {

if (args.length == 1) {

new Main(args[0]);

} else {

System.err.println("usage: java Main ");

}

}

}

相比较上面的程序,这个程式就简单的多,它就是调用你本地的图片,进行多角度显示。java.awt.Frame.getToolkit().getImage(filename)和Graphics.drawImage()是重要的方法。

3。画圆程式:

import java.awt.*;

import java.util.*;

import java.io.*;

class Main extends Frame {

Vector points = new Vector();

Main() {

super("drawOval Example");

setSize(200, 200);

show();

}

void addPoint(Point p) {

points.addElement(p);

repaint();

}

public void paint(Graphics g) {

Insets insets = getInsets();

int x = insets.left, y = insets.top;

for (int i=0; i Point p = (Point)points.elementAt(i);

g.drawOval(x+p.x-5, y+p.y-5, 10, 10);

}

}

static public void main(String[] args) {

Main m = new Main();

BufferedReader dis =

new BufferedReader(new InputStreamReader(System.in));

while (true) {

try {

m.addPoint(new Point(

Integer.parseInt(dis.readLine()),

Integer.parseInt(dis.readLine())));

} catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

}

}

}

这个程式也比较简单,不过他调用了个System.in来限制画圆的坐标。

4.画三角形:

import java.awt.*;

import java.awt.event.*;

class Main extends Frame {

Polygon polygon = new Polygon();

Main() {

super("drawPolygon Example");

addMouseListener(new MouseEventHandler());

addMouseMotionListener(new MouseMotionEventHandler());

setSize(200, 200);

show();

}

public void paint(Graphics g) {

System.out.println("paint:");

g.drawPolygon(polygon);

}

// The default update method clears the screen which causes

// flicker. This override avoids this.

public void update(Graphics g) {

System.out.println("update:");

paint(g);

}

class MouseEventHandler extends MouseAdapter {

public void mousePressed(MouseEvent evt) {

System.out.println("mousePressed:");

polygon.addPoint(evt.getX(), evt.getY());

repaint();

}

}

class MouseMotionEventHandler extends MouseMotionAdapter {

public void mouseDragged(MouseEvent evt) {

System.out.println("mouseDragged:");

polygon.addPoint(evt.getX(), evt.getY());

repaint();

}

}

static public void main(String[] args) {

new Main();

}

}

画三角形是一个很有意思的东东。它注意是确定三个点了。第一个是最重要的。以后所有的三角形也这个为中心,如果你拖动鼠标的话,就会出现N多。

5.写字:

import java.awt.*;

import java.awt.event.*;

class Main extends Frame implements ItemListener {

MainCanvas cv = new MainCanvas();

Choice choice = new Choice();

Main() {

super("drawString Example");

for (int i=4; i<60; i += 4) {

choice.addItem(""+i);

}

choice.select(0);

choice.addItemListener(this);

cv.setFontSize(4);

cv.setSize(300, 100);

add(cv, BorderLayout.CENTER);

add(choice, BorderLayout.SOUTH);

pack();

show();

}

public void itemStateChanged(ItemEvent evt) {

String what = (String)(evt.getItem());

cv.setFontSize(Integer.parseInt(what));

}

static public void main(String[] args) {

new Main();

}

}

class MainCanvas extends Canvas {

void setFontSize(int size) {

Font f = getFont();

if (f == null) {

f = new Font("Serif", Font.PLAIN, size);

} else {

f = new Font(getFont().getName(), getFont().getStyle(), size);

}

setFont(f);

repaint();

}

public void paint(Graphics g) {

String s = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";

FontMetrics fontM = g.getFontMetrics();

g.setColor(Color.white);

g.fillRect(0, 0, fontM.stringWidth(s), fontM.getHeight());

g.setColor(Color.black);

g.drawString(s, 0, fontM.getAscent());

}

}

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java graphics类_java_关于Graphics类相关推荐

  1. java graphics 类_对于 Graphics 类的一点认识(转)

    AWT 提供了一些用户接口的构件,但是它不提供一些类似的纯粹的绘制图形的对象,例如 Rectangle.Polygon 和 Point 类没有任何绘制图形的能力.换句话说它们不具备 draw 方法,仅 ...

  2. java语言常用的包和类

    一.java语言中的常用包 由于java语言的package是用来存放类与接口的地方,所以也把package译为"类库",即java类库是以包的形式实现的,java语言已经把功能相 ...

  3. java graphics2d 绘图_Java编程 Graphics2D类的绘图方法

    现在都讲究立体的效果,Graphics2D类的绘图方式就属于高级绘图了,在我们日常生活中经常提到的2d.3d电影都是立体的,而编程语言也是一样,可以实现2d的效果哦,下面就让我们一起来学习下吧! Ja ...

  4. java jframe类_Java-GUI笔记——JFrame类

    1.JFrame类 1.1 JFrame类在javax.swing 包中--主要提供各种组件(窗口/按钮/文本框),在Java中还提供了另外2个做GUI开发的包. java.awt 包 – 主要提供字 ...

  5. 分享一个Java生成二维码工具类

    分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...

  6. java unsafe获取指针_【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  7. Java知识点总结(JavaIO-合并流类)

    Java知识点总结(JavaIO- 合并流类 ) @(Java知识点总结)[Java, JavaIO] [toc] 合并流的主要功能是将两文件的内容合并成一个文件 public class Demo1 ...

  8. java 嵌套类 继承_Java嵌套类 - 爱吃苹果的搬运工的个人空间 - OSCHINA - 中文开源技术交流社区...

    在Java中可以创建几种不同类型的嵌套类: 静态嵌套类: 静态内部类可以独立于外部类被实例化,无法访问外部类中的非静态属性和方法,只能外部类的实例来访问外部类的非静态变量 public class O ...

  9. java.lang.Instrument 动态修改替换类代码

    java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...

  10. Java File类总结和FileUtils类

    Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...

最新文章

  1. 笔记本电脑怎么清理灰尘_用了这么多年电脑,你该清理清理这个,将会又快又流畅...
  2. Jmeter 多台机器产生负载及问题解决方法
  3. 教你打造一个Android组件化开发框架
  4. 爱奇艺体验Serverless极致扩缩容,资源利用率提升40%
  5. 一些有关使用EF的错误用法展开的思考
  6. optionals_Java Optionals获得更具表现力的代码
  7. NOI大纲 CSP初赛篇·知识大纲 CSP-入门级-NOI大纲
  8. Leetcode —— 208. 实现 Trie (前缀树)(Python)
  9. 有向无环图描述表达式
  10. 物联网之感知-分布式光纤传感-应用前景分析
  11. Flutter Android权限问题
  12. 别找了诸位 【十二款超级好用的谷歌插件都在这】(确定不来看看?)
  13. 微信公众号推送模板消息,推送个人消息,给指定的人发送模板消息
  14. R语言金融波动率建模|基于SGED分布的变参数ARIMA+EARCH动态预测模型的研究
  15. 11 JavaScript删除链表的节点 牛客网JZ18
  16. 微信H5页面分享案例模版
  17. [顺序刷] M6/M8/M11/E12/E14
  18. weblogic启动报错:BEA-149265
  19. 3. node.js 异步式I/O或非阻塞式I/O
  20. 苹果笔记本能不能用python_苹

热门文章

  1. 2022年茶艺师(初级)上岗证题库及在线模拟考试
  2. 小魔术用计算机猜年龄,魔术中的数学之猜年龄
  3. 一个人摘了一些桃子,第一天卖掉了一半,又吃了一个,第二天卖掉了一半,又吃了一个,以后天天都是如此处理,到第n天发现桃子只剩下一个桃子,n是参数,返回值是一共摘的桃子数。 求两个数的最大公约数
  4. 服务器带宽超出限制如何解决?
  5. 1.请求和响应(phalapi框架总结)
  6. 百度地图 和百度导航及语音集成冲突解决办法
  7. 【数据分析】如何构建指标体系 设计一份优质报表
  8. python可以下载百度文库_python+selenium爬取百度文库不能下载的word文档
  9. python pipe_Python os.pipe()用法及代码示例
  10. 高中数学怎么学好我的数学学习方法