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