AWT编程基础(二)

1.AWT菜单

    我们使用窗口时,在窗口的上端会有菜单栏,做一个菜单栏常用的组件有:

           MenuBar:它是菜单栏顶级容器,一级菜单,我们将菜单做好后添加进它中,再将它添加进窗口中

           Menu:菜单栏的二级容器,他就是我们常见的直接显示给我们的选项,当我们点击它后,会出现它的子类选项,它就像对更底级的Menu的一个分类

           MenuItem:它是最底层的组件,放在Menu中,当我们点开Menu后所出现的就是它,它所存储的就是实际的功能。它的可以接收一个标签文本,还可以接受一个MenShortcut(KeyEvent_A);的参数,来设置它的快捷键。

import java.awt.*;
import java.awt.event.KeyEvent;
public class MenuDemo {
	private Frame f;
	private MenuBar mb;//创建菜单顶级容器
	private Menu file;//二级菜单
	private Menu edit;
	private MenuItem newItem;//最底级菜单
	private MenuItem saveItem;
	private MenuItem exitItem;
	private MenuItem copyItem;
	private MenuItem pasteItem;
	
	public MenuDemo() {
		init();
	}
	
	public void init() {
		mb=new MenuBar();
		f=new Frame("Test");
		f.setBounds(300,400,500,600);
		file=new Menu("文件");
		edit=new Menu("编辑");
		newItem=new MenuItem("新建",new MenuShortcut(KeyEvent.VK_N));
		saveItem=new MenuItem("保存",new MenuShortcut(KeyEvent.VK_S));//添加快捷键
		exitItem=new MenuItem("退出",new MenuShortcut(KeyEvent.VK_X));
		copyItem=new MenuItem("复制",new MenuShortcut(KeyEvent.VK_C));
		pasteItem=new MenuItem("粘贴",new MenuShortcut(KeyEvent.VK_V));
		file.add(newItem);
		file.add(saveItem);
		file.add(exitItem);
		edit.add(copyItem);
		edit.add(pasteItem);
		mb.add(edit);
		mb.add(file);
		f.setMenuBar(mb);
		f.setVisible(true);
	}
	public static void main(String[] args) {
		new MenuDemo();
	}
}

2.AWT绘图

    使用AWT绘图首先要使用的是AWT专门提供的Canvas类,这个类中提供了三种方法,分别为paint(),repaint(),update(),在这三个方法中用户所能调用的仅有repaint(),当用户调用repaint()后,接下来都有AWT来完成,repaint()调用update(),update()又调用paint(),所以我们要控制图形的样子,就要重写paint()。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class DrawDemo {
	private final String RECT_SHAPE="rect";
	private final String OVAL_SHAPE="oval";
	private Frame f=new Frame("TEST");
	private Button b1=new Button("rect");
	private Button b2=new Button("oval");
	private MyCanvas draw=new MyCanvas();
	private String Shape="";//用来记录现在需要的图形
	
	public void init() {
		Panel p=new Panel();//创建一个容器
		myEvent();
		p.add(b1);
		p.add(b2);
		draw.setPreferredSize(new Dimension(250,180));
		f.add(draw);
		f.add(p,BorderLayout.SOUTH);  //设置容器p所在的位置
		f.pack();
		f.setVisible(true);
	}
	
	public void myEvent() {
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Shape=RECT_SHAPE;
				draw.repaint();
			}
		});
		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Shape=OVAL_SHAPE;
				draw.repaint();
			}
		});
	}
	
	public static void main(String[] args) {
		new DrawDemo().init();
	}
	
	class MyCanvas extends Canvas{

		public void paint(Graphics g) {
			Random r=new Random(); //设置随机数
			if(Shape.equals(RECT_SHAPE)) {//通过全局变量来判断需要的形状
				g.setColor(new Color(200,100,80));//设置颜色
				g.drawRect(r.nextInt(200),r.nextInt(120),40,60);//随机位置画一个矩形
			}
			if(Shape.equals(OVAL_SHAPE)) {
				g.setColor(new Color(200,100,80));
				g.drawOval(r.nextInt(200),r.nextInt(120),50,40);//随机位置画一个圆形
			}
		}
	}
}

    在重写paint时,需要一个参数,Graphics,它是一个画笔工具,可以帮助我们实现一些图形的绘画。当用户单击按钮时触发repaint(),接着会调用其他的函数,如果改变窗口大小或者重新打开窗口都会触发update()。

    做动画,也就是每隔一段时间刷新一下,重新绘画出新的图,由于刷新时间很短,所以看不出来。可以使用swing中提供的

Timer(int dalay,ActionLister l)  每间隔dalay秒就会触发监听器。

3.BufferedImage类

    通过做一个手绘小程序来了解BufferedImage

    BufferedImage类就相当一个中间的缓冲器,它可以调用getGraphics()的到一个画笔,然后用画笔在BufferedImage上进行绘画,绘画完成后,调用paint()一次性将BufferedImage中的内容绘制到指定的组件上去。它就相当一个中间画板。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
public class HandDraw {
	private Frame f=new Frame("patin");//创建窗体
	private final int AREA_WIDTH=500;//宽
	private final int AREA_HEIGHT=400;//高
	private int preX=-1;//记录上一个坐标位置
	private int preY=-1;
	//创建一个右键菜单
	PopupMenu pop=new PopupMenu();
	MenuItem redItem=new MenuItem("red");
	MenuItem greenItem=new MenuItem("green");
	MenuItem blueItem=new MenuItem("blue");
	
	private Color foreColor=new Color(255,0,0);//用于保存画笔的颜色
	
	//定义一个BufferedImage对象
	BufferedImage image=new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_3BYTE_BGR);
	//获取对象的Graphics
	Graphics g=image.getGraphics();
	
	private DrawCanvas drawArea=new DrawCanvas();
	
	
	public void init() {
		//组合成右键菜单
		pop.add(blueItem);
		pop.add(greenItem);
		pop.add(redItem);
		myEvent();
		drawArea.add(pop);//将右键菜单加入到画布中
		g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);//将对象的初始颜色填为白的
		drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));//设置大小
		/*
		 * Dimension:封装组件中的宽度和高度
		 */
		f.add(drawArea);
		f.pack();
		f.setVisible(true);
	}
	
	public void myEvent() {
		//添加右键菜单的监听器
		redItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				foreColor=new Color(255,0,0);
			}
		});
		blueItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				foreColor=new Color(0,0,255);
			}
		});
		greenItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				foreColor=new Color(0,255,0);
			}
		});
		drawArea.addMouseMotionListener(new MouseMotionListener() {
			
			@Override
			public void mouseDragged(MouseEvent e) {  //拖拽鼠标的动作
				
				if(preX>0 && preY>0) {
					g.setColor(foreColor);//设置颜色
					g.drawLine(preX, preY,e.getX(),e.getY());
				}
				preX=e.getX();
				preY=e.getY();
				drawArea.repaint();//绘制
			}

			@Override
			public void mouseMoved(MouseEvent e) {
			}
		});
		
		drawArea.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {  //松开鼠标事件监听器
				if(e.isPopupTrigger()) {
					pop.show(drawArea, e.getX(),e.getY());
					preX=-1;
					preY=-1;
				}
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
	}
	
	
	public static void main(String[] args) {
		new HandDraw().init();
	}
	
	class DrawCanvas extends Canvas{
		public void paint(Graphics g) {
			g.drawImage(image, 0, 0,null);//一次性将BufferedImage中的内容写到指定的组件中
		}
	}
}

其实我们还是在鼠标移动的两点之间画直线来绘制的。

4.ImageIO

    通过BufferedImage可以将所绘制的暂时存在一个缓存中,如果我们需要将它存在磁盘中,就需要ImageIO工具类。它可以访问磁盘中的位图文件。这里通过一个对图片的缩放程序演示。

public class ImageDemo {
	
	private final int WIDTH=80;//宽度
	private final int HEIGHT=60;//高度
	BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
	Graphics g=image.getGraphics();//获取画笔工具
	
	public void zoom() throws Exception{
		Image srcImage=ImageIO.read(new File("D:\\下载\\a.jpg"));//读取原始文件
		g.drawImage(srcImage,0,0,WIDTH,HEIGHT,null);//将原文件缩小后直接存进Image中
		ImageIO.write(image, "jpeg",new File(System.currentTimeMillis()+".jpg"));//直接将其写入磁盘文件中
	}
	
	
	public static void main(String[] args) throws Exception {
		new ImageDemo().zoom();
	}
}

猜你喜欢

转载自blog.csdn.net/waectr/article/details/80762814
AWT