介绍
作为一名 Java 初学者,在学习 Java 图形界面编程(GUI)的过程中,我尝试开发了一个简易的画图工具。这个小项目让我对 Java 的 AWT(Abstract Window Toolkit)和 Swing 组件有了更直观的认识,也体验到了从代码到图形界面交互的乐趣。
这个画图工具的界面不算复杂,上方设置了一排功能按钮,像直线、矩形、等腰三角形、三角形、多边形、曲线绘制,还有橡皮擦功能以及颜色选择窗口。下方则是一块空白的绘图区域,供我们发挥创意,绘制各种图形。
在开发过程中,我主要运用了 Java 的事件监听机制来实现交互。比如,当点击 “直线” 按钮时,程序要能捕获到这个点击事件,然后在绘图区域,根据鼠标的按下和释放动作,确定直线的起点和终点,进而绘制出直线。对于不同图形,都需要编写对应的逻辑来处理鼠标事件,计算图形的各项参数,再利用 Graphics 类的绘图方法将图形呈现出来。
虽然这个画图工具还比较基础,可能在功能完善度、界面美观度等方面还有很大的提升空间,但对于我这样的初学者来说,它是一个很好的实践载体,帮助我把书本上的 Java GUI 知识转化为实际可操作的项目,也让我对面向对象编程在图形界面开发中的应用有了更深的理解。接下来,我会继续优化这个工具,比如添加更多图形样式、完善颜色选择功能等,在实践中不断提升自己的 Java 编程能力。
目录
1.显示画图工具的界面(功能按钮)
2.监听器:鼠标监听器方法
3.画笔:在界面程序中显示图形
过程
步骤 1:搭建画图工具界面(Swing 窗体)
1.1显示画图工具的界面
public class DrawUI{
//属性
//方法(显示画图工具的方法)
Public void initUI(){
JFrame jf = new JFrame
//爆红了就加头文件
1.2 然创建一个窗体

1.3 设置可见
Jf.setVisible(true);
1.4 加上主函数
public static void main (String [] args){w
DrawUI ui = new DrawUI ();
ui.initUI();
最后就可以实现下面图片的内容

步骤 2:实现鼠标监听器(处理绘图交互)
//监听器
事件源:窗体
2.1 给窗体添加鼠标监听器方法
Jf.addMoudeListener();
2.2 绑定处理类
1.按住Ctrl 点击鼠标监听器查参他的数据类型(引用类型 接口 关键词interface)
![]()
![]()
2.重新定义一个类 DrawListener (处理类)
Public class DrawListener implement MoudeListener
注意;接口,我们要用调用监听器的方法查看需要怎样接口
如果报错了就加头文件,然后重新接口中的所有的抽象方法,进入到接口中复制接口的抽象方法(这个抽象方法同时也是事件处理方法)

3.然后我们要用处理类的对象跟监听器绑定一下
MoudeListener listener =new MoudeListener();
Jf.addActionLitener (listener);
2.4 然后给抽象方法加上输出语句
1.System.out.println(“点击”)
System.out.println(“按下”)
System.out.println(“松开”)
如下图

2.运行后,可以发现想要移动鼠标就没有点击,只有按下松开


3.所以我们想要画出图形比如线段,我们只会用到鼠标监听器的按下和松开.
步骤 3 添加画笔
//画笔:图形内容显示在哪个组件上获取,画笔就从该组件上获取
3.1 从窗体上获取对象(一定要要在窗体显示之后)
Jf.getGraphics
// jf 是窗体的对象
3.2 查看返回值,反回值类型是Graphics

3.3所以我们要用相同返回值的变量来保存 Graphics g = jf.getgraphics();
如果爆错就加头文件

![]()
步骤4. 引用传递
4.1 通过对象调用属性
画笔对象的数据类型是Graphics
1.在处理类加上 Public Graphics gr ;
2.在DrawUI的类里加上 Listener.gr = g

步骤5.绘制图形
5.1 在抽象方法下添加gr.drawLine();
1.然后就会出现坐标,然后前面也说过所以我们想要画出图形比如线段,我们只会用到鼠标监听器的按下和松开
2.所以我们需要在抽象方法的输出语句 按下,获取当前坐标。
5.2 通过参数MouseEvent e,去用e这个对象来获取当前位置
e.get x ();
e.get y ();
查看返回值都是int
5.3 定义变量保存
Int x1= e.get x ();
Int y1= e.get y ();
5.4.抽象方法的输出语句松开也用这个方法
Int x2= e.get x ();
Int y2= e.get y ();
5.5 然后把坐标加到绘画图形下面
gr.drwaline (x1,y1,x2,y2)

如果报错,就是出现了局部变量
局部变量分别为两种
1.在方法中定义的变量 //方法也叫作用域:一对大括号它就是一个独立的作用域
2.方法的参数(MouseEvent e )
而MouseEvent e 是局部变量
5.6.用全局变量去解决:属性
把x1,y1,x2,y2变成全局变量
Public int x1,y1,x2,y2;
注意:当我们在上面定义好属性,在下面保存数据的过程中,int x1要去掉int(整形),如果不去掉就是在重新定义变量 (X,Y要大写)

5.7 实现画直线的功能

画出其他图形
增添功能按钮

然后会发现整个按钮都在真中间

添加流式布局

`
再次添加按钮

实现功能

给按钮加加监听器
addActionlistener的返回值是interface(接口)
然后在子类里添加接口
//子类可以添加多个接口
//实现接口publiuc class 子类 implement 接口,接口,,,{}
![]()
重写接口中的抽象方法

给动作监听器绑定对象
![]()
//listener是监听器绑定的对象,因为DrawListener这个类绑定了两个接口,它既可以处理鼠标监听器也可以处理动作监听器.
//要把这个对象写在上面,因为代码是按照顺序原则,如果写在监听器的下面,动作监听器是无法识别到这个对象的.

识别按钮
//如果识别不到,那监听就是没有意义的
获取按钮上的类容
//利用ActionEvent e 的对象e,用这个对象获取类容然后用变量去去保存这个类容
//额e.getActionCommang 的返回值是String

![]()
在处理类添加画笔,画出矩形和三角形

用if循环去判断当前的name
//这样可以限制每次画图画出一个
//在画图形之前去判断当前这个name是什么类容,然后他就可以进入对应的判断语句

//爆红是因为局部变量的问题
把局部变量改成全局变量
//所以把name定义成属性


4373

被折叠的 条评论
为什么被折叠?



