awt绘图_位图处理
如果仅仅绘制一些简单的几何图形,程序的图形依旧十分简单。AWT允许在组件上绘制位图,Graphics提供了drawmage(Image image)方法用于绘制位图,该方法需要一个Image参数一一代表位图,通过该方法就可以绘制出指定的位图。
位图使用步骤: 1、创建Image的子类对象BufferedImage(int width,int heigth,int ImageType),创建时需要指定位图的宽高及图片类型;此时相当于在内存中生成了一张图片 2、调用BufferedImage对象的getGraphics()方法获取画笔,此时就可以往内存中的这张图片上绘图了,绘图的方法和之前学习的一样 3、调用组件paint()方法中提供的Graphics对象的drawImage()方法,一次性的内存中的图片BufferedImage绘制到待定的组件上
使用位图绘制组件的好处: 使用位图来绘制组件,相当于实现了图的缓冲区,此时绘图时没有直接把图形绘制到组件上,而是先绘制到内存中的BufferedImage上,等全部绘制完成后,再一次性的图像显示到组件上即可,这样用户的体验会好很多
drawArea.addMouseMotionListener指的是按下鼠标移动的 drawArea.addMouseListener指的是不移动鼠标的
awt绘图_位图处理的练习
xxxxxxxxxx
package ch29;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
public class a_8_0awt_绘图_位图处理 {
private Frame frame = new Frame("简单绘图工具");
//定义画图区域的宽高,即我们的绘图区域
private final int AREA_WIDTH = 500;
private final int AREA_HEIGHT = 400;
//定义一个右键菜单,用于设置画笔的颜色,PopupMenu为鼠标右击
private PopupMenu colorMenu = new PopupMenu();
private MenuItem reditem = new MenuItem("红色");
private MenuItem buleitem = new MenuItem("蓝色");
private MenuItem greenitem = new MenuItem("绿色");
//定义一个变量记录当前画笔的颜色,即默认颜色
private Color forceColor = Color.BLACK;
//创建一个BufferImage位图对象。宽、高、类型
BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB);
//通过位图,获取关联的Graphics对象
Graphics g = image.getGraphics();
//自定义一个类,继承Canvas
private class MyCanvas extends Canvas {
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null);//绘图区域。x位置,x位置、无观察者
}
}
//取自定义类中对象drawArea绘图区域
MyCanvas drawArea = new MyCanvas();
//定义一个变量,记录鼠标在拖动过程中上一次所处的坐标
private int preX = -1;
private int preY = -1;
//组装视图
public void init() {
//组装视图,逻辑控制。即监听器
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//e.getActionCommand()获取的是new MenuItem("红色")中的“红色”
String actionCommand = e.getActionCommand();
switch (actionCommand) {//区分当前点击的是哪个颜色
case "红色":
forceColor = Color.RED;//把色笔颜色赋值为红色
break;
case "蓝色":
forceColor = Color.BLUE;
break;
case "绿色":
forceColor = Color.GREEN;
break;
}
}
};
//将按钮添加监听器并使之进行监听。把监听器事件赋值给菜单项
reditem.addActionListener(actionListener);
buleitem.addActionListener(actionListener);
greenitem.addActionListener(actionListener);
//colorMenu
colorMenu.add(reditem);
colorMenu.add(buleitem);
colorMenu.add(greenitem);
//把colorMenu放在绘图区域
drawArea.add(colorMenu);
drawArea.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {//当鼠标抬起时被调用
boolean popupTrigger = e.isPopupTrigger();
if (popupTrigger) {
//将colorMenu在drawArea展现出来,鼠标点击的x与y轴位置
colorMenu.show(drawArea, e.getX(), e.getY());
}
}
});
//设置位图背景为白色
g.setColor(Color.white);
g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);//从x、y位置开始绘制,绘制到AREA_WIDTH、AREA_HEIGHT位置结束
//通过监听鼠标的移动,完成线条绘制
drawArea.addMouseMotionListener(new MouseMotionAdapter() {
//适配器,即只重写我们需要的方法
public void mouseDragged(MouseEvent e) {
if (preX != -1 && preY != -1) {//当拖动的时候才开始画线
g.setColor(forceColor);
//画线条,需要两组坐标,分别代表线条的起点与终点,e.getX(),e.getY()可以获取终点坐标。如何获取起点坐标,在69行那里写
g.drawLine(preX, preY, e.getX(), e.getY());
}
//修正preX与preY的值
preX = e.getX();
preY = e.getY();
//重绘组件
drawArea.repaint();
}
});
drawArea.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
//重置preX和preY。作用是下一次画线的时候,保证是正常的
preX = -1;
preY = -1;
}
});
//将绘画区域设置为最合适的区域
drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));//画布的大小
frame.add(drawArea);
//设置frame最佳大小并可见
frame.pack();
frame.setVisible(true);
//给Frame设置WindowListener监听器,监听用户点击右上角X的动作,则关闭窗口
frame.addWindowListener(new WindowAdapter() {
//采用Java通过的适配器设计模式,我们只需要重写自己需要的方法,例如windowClosing方法,如下
public void windowClosing(WindowEvent e) {
System.exit(0);//原理:退出JVM虚拟机,即退出当前运行的Java程序
}
});
}
public static void main(String[] args) {
new a_8_0awt_绘图_位图处理().init();
}
}