#用JAVA做一个简单的画图软件
写在前面
第一次用Java写东西,未免有疏漏之处,请多多指正。
首先 建立画布。
这里利用JFrame窗体界面创建一个DrawerFrame类,在主函数中实例化DrawerFrame类,并调用showUI方法,画出程序的基本框架。
public class DrawerFrame {
public static void main(String[] args){
DrawerFrame df= new DrawerFrame();
df.showUI();
}
public void showUI(){
//窗体
MyFrame jf=new MyFrame();
jf.setSize(900,900);
jf.setTitle("画图界面");
//居中显示
jf.setLocationRelativeTo(null);
//退出进程
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置可见
jf.setVisible(true);
}
现在效果如下
第二步 往画板上面增加画图功能
这是目标
- 从最简单的画直线开始 由于画板的画图功能是通过鼠标出发,所以要增加一个MouseListener,实现对鼠标信息的获取。
//监听方法
DrawerMouse m=new DrawerMouse();
jf.addMouseListener(m);
- 这里的DrawerMouse是由MouseListener(抽象类,每个接口都必须实现)重写而来。(tips:
如果不知道这些接口的作用,可以像这样做,然后一边操控鼠标一边在控制面板查看输出)
画直线段需要知道起始点(X1,Y1)和终点(X2,Y2)的坐标,在鼠标按下的时候,此时光标的位置即为起点。松开时,则得到终点。
public void mousePressed (MouseEvent e){
x1 = e.getX();
y1 = e.getY();
}
public void mouseReleased (MouseEvent e){
x2 = e.getX();
y2 = e.getY();
//画图
gr.drawLine(x1, y1, x2, y2);
}
- 画矩形十分简单,但是要考虑矩形的方向。
- 下面讲讲怎么画曲线和喷枪。画曲线要检测到鼠标的拖动动作,这里还是用到现成的ActionListener,同MouseListener一样,需要对其接口重写。画曲线可以理解为画无数很短的直线,这样的话,如果我们不断更新直线的起点和终点,就能通过画直线的方式画出曲线。
public void mouseDragged(MouseEvent e){
x2 = e.getX();
y2 = e.getY();
if( ActionCommand.equals("曲线")){
gr.drawLine(x1, y1, x2, y2);
x1=x2;
y1=y2;
}
-
喷枪功能与画直线类似,只不过画的是点而不是直线,并且这些点是不连续的、随机的。
-
喷枪功能与画直线类似,只不过画笔的颜色要与画板背景颜色一致。
按照以上步骤实现DrawerMouse类大致如下:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
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.util.ArrayList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.UIManager;
public class DrawerMouse implements MouseListener,ActionListener,MouseMotionListener {
public Graphics2D gr;
public int x1=0,y1=0,x2=0,y2=0;
public int pre_x1,pre_y1,pre_x2,pre_y2,source_x,source_y;//pre_x1,pre_y1,pre_x2,pre_y2记录上一次的(x1.y1) (x2,y2);(source_x,source_y)是多边形的第一个点
public String ActionCommand,Colorcommand;
public boolean FirstEdgeDone;//判断多边形第一条边是否画出
public ArrayList <Shape> date=new ArrayList <Shape>