Java GUI入门项目:画图板

这篇博客引导初学者使用Java的GUI库(awt和swing)创建一个简单的画图板应用,涵盖了界面设计、监听器实现、基本图形绘制及优化。通过这个项目,你可以了解到GUI的基本组件、事件处理和图形绘制技巧,让你的程序脱离控制台输入,提升用户体验。
摘要由CSDN通过智能技术生成

刚学习Java的小伙伴肯定觉得在控制台输入、打印的操作low爆了吧,那么你可以试一试画图板项目。完成这个项目之后,你可以制作一个属于自己的画图板,来取代电脑自带的画图板
通过这个项目,你可以学习到GUI的基本知识以及监听控制界面的知识

一、准备界面

制作界面前,我们需要认识awt包与swing包,他们都是图形界面工具包,为我们提供了各种组件来制作界面

  • awt包:依赖于操作系统,组件属于重量级组件,也就是不同的操作系统呈现出来的组件样式不一样
  • swing包:不依赖于操作系统,组件属于轻量级组件,类名都以J开头,为新一代图形界面工具,组件相较于awt更为美观

1、界面属性设置

1)基本属性

JFrame frame = new JFrame();
frame.setSize(500,500);//界面的宽,高
frame.setTitle("画图板");//界面的标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击界面的关闭按钮后,进程关闭
frame.setLocationRelativeTo(null);//界面居中显示
frame.setResizable(false);//不可以对界面大小进行操作
frame.setVisible(true);//对以上写的组件可视(这一步至关重要)

2)布局器

常见的布局器有

  1. 流式布局器(FlowLayout):界面上的组件根据add的顺寻从左到右,从上到下依次添加到界面上
  2. 边框布局器(BorderLayout):将界面分为东西左右中五个方位,每一个方位仅可以添加一个组件,JFrame默认为边框布局器

这里我们选择流式布局器,让按钮在界面上均匀摆放

frame.setLayout(new FlowLayout());

2、界面组件添加

要制作画图板,那么按钮肯定不能少,我们要通过点击按钮来切换绘制的图形
所以还是用到了swing包下的JButton组件

JButton btn = new JBUtton("直线");//参数为按钮中显示的文字
btn.setPreferredSize(new Dimension(20,20));//设置按钮的首选大小
frame.add(btn);//将按钮添加到界面上

对按钮的美化操作请参考按钮美化

二、监听器

1、实现接口

界面准备好之后,我们就要开始对于界面的各种组件的监听以及用户动作的监听,这样用户与界面才能够有交互
新建一个类FrameListener,用于对界面进行监听
监听器类要实现监听就要实现不同的监听器接口

  1. ActionListener:对组件进行监听
  2. MouseListener:对用户鼠标在界面上的操作进行监听(点击,按下,释放,进入,移出)
  3. MouseMotionListener:对用户鼠标在界面上的拖拽,移动的动作监听

注意:实现一个接口,就必须实现接口中的所有方法

2、怎样画图

我们需要在界面可视化之后获取画笔才能在界面上进行绘制

Graphics g = frame.getGraphics();//界面可视化之后获取界面的画笔

我们可以创建一个传画笔的构造器,使得监听器可以对界面进行绘制

3、绘制基本图形

x1,y1:按下时的坐标
x2,y2:释放时的坐标
GUI的坐标系采用的时笛卡尔坐标系,原点在左上角
在这里插入图片描述

1)直线

g.drawLine(x1,y1,x2,y2);

2)矩形

前两个参数为矩形的左上角坐标,后两个参数为矩形的宽,高
注意:纵坐标小的点才是矩形的左上角

g.drawRect(y1>y2?x1:x2,y1>y2?y1:y2,Math.abs(x2-x1),Math.abs(y2-y1));

3)椭圆

绘制原理与矩形同理

g.drawOval(y1>y2?x1:x2,y1>y2?y1:y2,Math.abs(x2-x1),Math.abs(y2-y1));

4)铅笔

实现铅笔小效果,需要实现MouseMotionListener与MouseListener两个接口

    @Override
    public void mouseReleased(MouseEvent e) {
        isPressed = false;
    }
    @Override
    public void mouseDragged(MouseEvent e) {
        //当选择画直线时,鼠标拖拽,每次都记录上一个点,下一个点与上一个点相连
        if(strnum== Message.PENCILE){
            if (!isPressed) {
                x1 = e.getX();
                y1 = e.getY();
                isPressed = true;
            } else if (isPressed) {
                x2 = e.getX();
                y2 = e.getY();
                g.drawLine(x1,y1,x2,y2);
                x1 = x2;
                y1 = y2;
            }
        }
    }

三、优化

以上我们就可以完成一个简易的画图板,但是想要对绘制的图形进行恢复,删除的操作是不可以的
另外但我们把界面拖拽到显示屏外,会发现图形消失了
这是因为拖拽回来后会对之前遮盖的那一部分的界面进行重绘,因为没有保存图形的信息,所以重绘后会消失。
我们可以将图形封装为图形类Shape

public class Shape{
	//构造器传参
	int x1,y1;//按下点
	int x2,y2;//释放点
	Color color;//yanse
	String type;//图形种类
	
	public void drawShape(Graphics g){
		//通过if-else语句对图形的种类进行判断
		//然后进行绘制
	}
}

这样我们在监听的时候,只需要通过参数构造Shape,然后调用drawShape方法进行绘制就可以了,这也就解决了保存图形信息的问题
我们可以在监听器类中创建ArrayList来保存Shape
在继承了JFrame的界面类中重写JFrame的paint方法,遍历ArrayList进行绘制即可


最后给大家分享一下我的画图板

在这里插入图片描述

看到了这里,相信大家对GUI充满了兴趣,那么就敲动你的代码,写出属于你自己的画图板吧!

对以上内容有疑问的小伙伴也欢迎在评论区讨论哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值