1 packagedemo;2
3
4
5 importjava.awt.BorderLayout;6 importjava.awt.Color;7 importjava.awt.FlowLayout;8 importjava.awt.Graphics;9 importjava.awt.Toolkit;10 importjava.awt.event.MouseAdapter;11 importjava.awt.event.MouseEvent;12 importjava.awt.event.MouseMotionAdapter;13 importjava.util.Arrays;14
15 importjavax.swing.JButton;16 importjavax.swing.JFrame;17 importjavax.swing.JPanel;18 /**
19 * Java 直线、多段线画板 PaintJFrame (整理)20 *21 * 2016-1-2 深圳 南山平山村 曾剑锋22 *23 *
24 *
一、软件声明:
25 *
      26 * 本软件是仿AutoCAD部分功能软件,最初设计之初的想法是:实现各种图形的绘制(直线、多段线、圆、写轮眼)。但是27 * 当实现到了目前的状态的时候发现后面的程序开发只不过是对当前程序的复制、粘贴,而且最终绘制出来的图形看上去并不是28 * 很精细、优雅,就如同当您在使用本软件的时候会发现,绘制出来的直线是那种很让人纠结的线,不够平滑的感觉,至少她让29 * 我本人感觉不是太舒服的感觉。30 *
31 *      32 * 同时如果在软件中添加过多的东西,会让人觉的更难以阅读理解,不适合用来沟通交流,尤其是像这种只能通过文字沟通33 * 的方式,所以本人不打算对此软件进行进一步的扩展。34 *
35 *二、软件结构如下:
- 36 *
- 所有类的继承关系如下:
37 *- 绘图类继承关系:
38 * |--Shape
39 * |--|--SingleLine
40 * |--|--MultiLine
41 * - 按钮类继承关系(括号内为添加的监听事件):
42 * |--JButton
43 * |--|--PaintJButton
44 * |--|--|--SingleJButton(MouseAdapter)
45 * |--|--|--MultiJButton(MouseAdapter)
46 * - 窗口类继承关系:
47 * |--JFrame
48 * |--|--PaintJFrame
49 * - 绘图面板继承关系(PaintJFrame的内部类,括号内为添加的监听事件):
50 * |--JPanel
51 * |--PaintJPanel(MouseAdapter,MouseMotionAdapter)
52 *
- 绘图类继承关系:
- 绘图类与按钮来的逻辑关系如下:54 *
- SingleLine和SingleJButton是对应的;55 *
- MultiLine和MultJButton是对应的;56 *
- 当按下SingleJButton时,就能够在面板上绘制SingleLine;57 *
- 当按下MultJButton时,就能够在面板上绘制MultiLine;58 *
- GUI图形界面容器、组件的包含关系:
60 *- 61 * |--PaintJFrame(窗口容器,位于main函数中,BorderLayout布局)
62 * |--|--buttonJPanel(JPanel容器,全局变量,FlowLayout布局)
63 * |--|--|--singleLineJButton(绘直线按钮,paintJButtons数组中下标为0的位置)
64 * |--|--|--multiLineJButton(绘多段线按钮,paintJButtons数组中下标为1的位置)
65 * |--|--paintJPanel(JPanel画板,全局变量)
66 *
- 61 * |--PaintJFrame(窗口容器,位于main函数中,BorderLayout布局)
69 public class PaintJFrame extendsJFrame{70 private static final long serialVersionUID = 1L;71 /**
72 *        73 * 主要用于保存所画图的类型,如:直线、多样线等内容,可以认为是一个容器,包含所有的图形的基本信息,74 * 每次当前绘制的图形都保存在shapes的最后一个位置上,主要是为了便于查找。75 */
76 Shape[] shapes ={};77 /**
78 * 定义一个绘图面板,主要用于绘图79 */
80 PaintJPanel paintJPanel = newPaintJPanel();81 /**
82 * 定义一个按钮面板,主要用于放置按钮83 */
84 JPanel buttonJPanel = new JPanel(newFlowLayout());85 /**
86 * 主要用于保存动态的X轴坐标,通过鼠标移动监听器来获取87 */
88 int trendsX = 0;89 /**
90 * 主要用于保存动态的Y轴坐标,通过鼠标移动监听器来获取91 */
92 int trendsY = 0;93 /**
94 * 主要用于保存点击时的X轴坐标,通过鼠标移动监听器来获取95 */
96 int clickX = 0;97 /**
98 * 主要用于保存点击时的Y轴坐标,通过鼠标移动监听器来获取99 */
100 int clickY = 0;101 /**
102 * 用于放置各种按钮,主要用于凸现当前绘图时的按钮,方便查找,修改103 */
104 PaintJButton[] paintJButtons = new PaintJButton[2];105 /**
106 *
窗口构造函数功能如下:
- 107 *
- setButtonJPanel();设置按钮面板,主要是添加一些需要的按钮在其中;108 *
- setJFrame();设置窗口属性,主要是窗口的一些基本属性设置;109 *
- paintJPanel.startRun();启动paintJPanel内部线程,主要用于对画板中图形的计算以及重绘110 *
112 publicPaintJFrame() {113 setButtonJPanel();114 setJFrame();115 paintJPanel.startRun();116 }117 /**
118 *
设置按钮面板函数功能如下:
- 119 *
- 创建一个绘制直线的按钮,名字为:直线;120 *
- 创建一个绘制多段线的按钮,名字为