刚学习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)布局器
常见的布局器有
- 流式布局器(FlowLayout):界面上的组件根据add的顺寻从左到右,从上到下依次添加到界面上
- 边框布局器(BorderLayout):将界面分为东西左右中五个方位,每一个方位仅可以添加一个组件,JFrame默认为边框布局器
这里我们选择流式布局器,让按钮在界面上均匀摆放
frame.setLayout(new FlowLayout());
2、界面组件添加
要制作画图板,那么按钮肯定不能少,我们要通过点击按钮来切换绘制的图形
所以还是用到了swing包下的JButton组件
JButton btn = new JBUtton("直线");//参数为按钮中显示的文字
btn.setPreferredSize(new Dimension(20,20));//设置按钮的首选大小
frame.add(btn);//将按钮添加到界面上
对按钮的美化操作请参考按钮美化
二、监听器
1、实现接口
界面准备好之后,我们就要开始对于界面的各种组件的监听以及用户动作的监听,这样用户与界面才能够有交互
新建一个类FrameListener,用于对界面进行监听
监听器类要实现监听就要实现不同的监听器接口
- ActionListener:对组件进行监听
- MouseListener:对用户鼠标在界面上的操作进行监听(点击,按下,释放,进入,移出)
- 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充满了兴趣,那么就敲动你的代码,写出属于你自己的画图板吧!
对以上内容有疑问的小伙伴也欢迎在评论区讨论哦