JAVA 画图工具
文章目录
- JAVA 画图工具
- 背景和目的
- 1.介绍Java的图形界面类、常用的组件类和辅助类
- 1.1图形界面类
- 1.2常用的组件类和辅助类
- 2.思路分析
- 3.实例操作
- 3.1 创建画图工具-DrawFrame类,继承(extends)JFrame类。
- 3.2 创建监听器类-DrawListen
- 3.3 创建Shape类
背景和目的
我们是想实现一个像Windows系统里面的画图工具的界面。如下图,但是代码没有那么丰富的组件。
这次主要实现的有界面、窗体创建,画图的形状,如何保存画下来的图片,以及画笔的颜色等。阐述初步画图界面的逻辑和基本窗体的创建。
1.介绍Java的图形界面类、常用的组件类和辅助类
1.1图形界面类
1)AWT组件
AWT组件是JDK1.0的时候推出的图形界面类,它的名字是根据包名而来的:java.awt。
2)Swing组件
SWING组件是JDK1.4的时候推出的图形界面类,它的名字也是根据包名而来的:javax.swing。
SWING组件是基于AWT组件的基础上,采用纯JAVA语言实现的一套跨平台组件。
1.2常用的组件类和辅助类
1)容器组件类:组件上可以添加其他的组件,则该组件就是容器组件。我们将要用到的是JFrame。它是一个窗体容器组件类(属于顶级容器)。通常如果我们要实现一个图形界面,首先一定要先有一个顶级容器。
2)元素组件类:一般是用来显示文字、图片或者接受用户输入信息的组件。例如,按钮就是属于一种按钮元素组件类。
3)辅助类:帮助组件完成某一个特定功能的类。例如:java.awt.FlowLayout 流式布局类,就是属于辅助类。
2.思路分析
首先,我们需要创建一个顶级容器,将界面里面的元素组件都放置在容器内。
然后创建完界面内的各种按钮后,为了使界面内的按钮点击后有反应,我们需要加入动作监听器!调用按钮对象这个方法,就可以加上动作监听器。
接着,我们画图工具最重要的方法就是可以在窗体内画画,所以需要paint方法。
除此之外,如何画图图案(直线、矩形、多边形等)也是需要我们思考的。
以及画图时,如何使用不同的颜色绘画。画完图后,我们还需要写代码,将图案保留在界面。
这就是我们大致的思路!
3.实例操作
3.1 创建画图工具-DrawFrame类,继承(extends)JFrame类。
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;public class DrawFrame extends JFrame{//定义Shape数组,保存图形对象private Shape[] arrayShape = new Shape[100];//编写显示“画图界面”的方法public void showFrame(){// 创建窗体对象JFrame jf = new JFrame();this.setTitle("画图工具”);//设置窗体标题this.setSize(700, 700); //设置窗体宽和高this.setLocationRelativeTo(null); //表示画的东西是相对窗体的,这样就是画在窗体上了this.setDefaultCloseOperation(3); //创建流式布局FlowLayout flow = new FlowLayout();this.setLayout(flow);//创建按钮JButton jbu = new JButton("直线")this.add(jbu);JButton jbu2 = new JButton("矩形“);this.add(jbu2);//使窗体可见this.setVisible(true);//创建画笔,图形画在哪个组件上,画笔就从该组件上获取//从窗体上获取画笔对象Graphics g = this.getGraphics();但是按钮按下要有效果才是好按钮,所以对每一个按钮都需要安装一个“监听器”,这个监听器是一个新类,写着按钮要实现的功能,当按下按钮时就执行,以保证我们每按下一个按钮都会有我们想要的效果。创建鼠标监听器DrawListener mouse = new DrawListener(arrayShape,g);//给窗体添加鼠标监听器this.addMouseListener(mouse);//将鼠标监听器加到按钮上,实现传递jbu.addActionListener(mouse);jbu2.addActionListener(mouse);}/*** 重写绘制窗体的方法*/public void paint(Graphics g){super.paint(g); System.out.println("绘制窗体");//绘制图形,循环遍历arrayShapefor(int i=0;i<arrayShape.length;i++){Shape shape = arrayShape[i];if(shape != null){//绘制图形shape.drawShape(g);}}}public static void main(String[] args){DrawFrame frame = new DrawFrame();frame.showFrame();}}
3.2 创建监听器类-DrawListen
3.2.1 事件监听机制:它主要用来监视窗体、组件是否发生变化,并且获取这些变化的相应信息。
1) 事件源对象:所有的容器组件和元素组件都可以成为事件源对象。但是在具体的项目中并不是所有的组件都是事件源对象,只有你动作发生在某个组件上,该组件才是事件源对象。比如你需要对“登录”按钮进行点击操作,那么“登录”按钮就是一个事件源对象。
2)事件监听方法:捕获事件源对象上的动作。例如,addActionListener(ActionListener l),这就是一个动作监听方法。事件监听方法是由事件源对象提供的。它的主要作用就是捕获类似按钮组件上点击动作和捕获类似输入框对象上的键盘回车动作,然后收集信息和动作,将信息交给ActionListener类型的参数进行处理。
3)事件接口:发生动作后要执行的处理代码操作。比如,ActionListener 动作事件接口,它提供一个事件处理方法,方法中有、actionEvent参数,参数中储存之前获取的信息和动作。
3.2.2 创建监听器类-DrawListen
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;//继承多个接口
public class DrawListener implements MouseListener,ActionListener {//定义Graphics变量名为gr,用来保存传递过来的画笔对象private Graphics gr;private int x1,y1,x2,y2;private String name = "直线";//定义Shape数组,保存图形对象private Shape[] arrayShape;//操作数组的下标private int index = 0;public DrawListener(Shape[] arrayShape,Graphics gr){this.gr = gr;this.arrayShape = arrayShape;}//定义Set方法,获取私有属性
// public void setGr(Graphics g){
// gr = g;
// }
// public void setArrayShape(Shape[] arrayShape){
// this.arrayShape = arrayShape;
// }public void mouseClicked(MouseEvent e) {System.out.println("点击");//判断鼠标是否双击if(e.getClickCount() == 2){}}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("按下");x1 = e.getX();y1 = e.getY();}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("释放");x2 = e.getX();y2 = e.getY();if("直线".equals(name)){//画线gr.drawLine(x1, y1, x2, y2);//创建Shape对象,保存绘制该图形的数据Shape shape = new Shape(x1, y1, x2, y2, name);//保存到数组中arrayShape[index++] = shape;}if("矩形".equals(name)){//画矩形gr.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));}}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("进入");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("退出");}@Overridepublic void actionPerformed(ActionEvent e) {//获取按钮上的文字name = e.getActionCommand();System.out.println("name = "+name );}
}
3.3 创建Shape类
创建shape类的目的是为了保存画的图形,如果不保存,则窗体稍微有变化,如缩小窗体,图形就不会显示在界面上了。
import java.awt.Graphics;//创建图形类
public class Shape { //图形的属性private int x1,y1,x2,y2;private String name;/*** 定义构造方法,初始化图形的属性* this 表示本类对象,“我“* @param x1* @param y1* @param x2* @param y2* @param name*/public Shape(int x1,int y1,int x2,int y2,String name){this.x1 = x1;this.y1 = y1;this.x2 = x2;this.y2 = y2;this.name = name;}/*** 绘制图形的方法* @param g*/public void drawShape(Graphics g){
//switch case 的作用和if else 是一样的switch (name) {case "直线":g.drawLine(x1, y1, x2, y2);break;case "矩形":g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));break;}}}