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绘图_位图处理的练习
xxxxxxxxxxpackage 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(); }
}