javaGUI编程实现自制画图器用位图的方式

/*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();
    
    
    
    
    
    
    
    
    
    
    
    
}
	 
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值