/*Graphics 提供了drawImage(Image image)方法用于绘制位图,该方法需要一个Imag参数代表位图,通过该方法就可以 绘制指定的位图
*
*位图的使用步骤:
*1.创建Image的子类对象Bufferenedimage(int width,int height,int ImageType)创建时需要指定位图的高度宽度以及类型;此时相当于在内存中生成了一张图片
*2.调用BufferenedImage对象的getGraphics()方法获取画笔,此时就可以往内存中的这张图片上绘图了
*3.调用组件paint()方法中提供的的Graphics对象的drawimage()方法,一次性的内存中的图片Bufferenimage绘制到特定的组件上
*
*
*第一步先设置所需的窗体,组件,变量
*右键的菜单以及菜单项,位图的大小宽度和长度,定义一个画布
*第二步创建Bufferenedimage image对象指定位图的高度宽度,相当于在内存中化了一张照片,调用Bufferenedimage image 的方法getGraphics来获取画笔
*Graphics g=image.getGraphics();
*获取到画笔之后
*调用组件paint()方法中提供的Graphics对象的drawimage()方法一次性将你内存中的照片绘制到特定的组件上
*class MyCanvas extends Canvas{
- void paint(Graphics g){
- g.drawimage(image ,0,0,null);
- };
- 第三步为右键实现监听器以及当点击菜单项时产生效果实现监听器,以及画图时的鼠标监听器
*/
在这里插入代码片
```package com.student2;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
public class test1 {
Frame frame=new Frame("王对儿专属画图小程序");
int AREA_WIDTH=3000;
int AREA_HEIGHT=4000;
//设置一个右键点击的菜单用于设置颜色
PopupMenu colormenu=new PopupMenu();
MenuItem reditem=new MenuItem("red");
MenuItem blueitem=new MenuItem("bule");
MenuItem greenitem=new MenuItem("green");
//设置一个变量记录此时所选用的颜色
Color forcecolor=Color.black;
//重点重点重点
//创建一个Bufferenedimag位图,相当于在内存中生成一张图片
BufferedImage imag=new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_RGB);
//通过位图获取关联的Graphics对象获取画笔,在内存中画图。
Graphics g=imag.getGraphics();
//自定义一个类继承canvas将g中的内存中的图片放到组件中去
private class MyCanvas extends Canvas {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g) {
//调用组件paint()方法中提供的的Graphics对象的drawimage()方法,一次性的内存中的图片Bufferenimage绘制到特定的组件上
g.drawImage(imag, 0, 0, null);
}
}
MyCanvas drawarea=new MyCanvas();
//定义变量记录鼠标拖动拖动过程中的上一处所处的坐标
int preX=-1;
int preY=-1;
//组装视图
public void init() {
//为右键中的选项设置监听器,当点击所选的颜色时颜色会发生变化
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String color=e.getActionCommand();
if(color=="red") {
forcecolor=Color.red;
}
if(color=="bule") {
forcecolor=Color.blue;
}
if(color=="green") {
forcecolor=Color.green;
}
}
};
reditem.addActionListener(listener);
blueitem.addActionListener(listener);
greenitem.addActionListener(listener);
colormenu.add(reditem);
colormenu.add(blueitem);
colormenu.add(greenitem);
//将右键放入绘图区域drawArea中
drawarea.add(colormenu);
//在画图区域中设置监听器,当在画图区域任意地方点击右键时出现菜单选项
drawarea.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {//当鼠标被抬起时调用
boolean flag=e.isPopupTrigger();
if(flag) {
colormenu.show(drawarea,e.getX(),e.getY());
}
//没重新抬起一次鼠标左键将起始点重置一次
preX=-1;
preY=-1;
}
});
g.setColor(Color.white);
g.fillRect(0,0,AREA_WIDTH,AREA_HEIGHT);
drawarea.addMouseMotionListener(new MouseMotionAdapter() {
@Override
//该方法当鼠标左键按下并移动时会被调用
public void mouseDragged(MouseEvent e) {
//画线条需要两组分别代表线条的起点坐标和终点坐标,e.getX()和e.getY()可以获取坐标
if(preX>0&&preY>0) {
g.setColor(forcecolor);
g.drawLine(preX, preY, e.getX(), e.getY());
}
preX=e.getX();
preY=e.getY();
//调用组件paint()方法中提供的的Graphics对象的drawimage()方法,一次性的内存中的图片Bufferenimage绘制到特定的组件上
drawarea.repaint();
}
});
drawarea.setPreferredSize(new Dimension(AREA_WIDTH,AREA_HEIGHT));
frame.add(drawarea);
frame.pack();
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String []args) {
new test1().init();
}
}