行业知识
通俗讲解Java绘图功能机制以及绘图框架
目录
一、Java绘图功能介绍
图一:使用Java提供的绘图功能绘制坦克大战中的坦克
二、Java绘图功能的基本结构
1、JFrame类(画板)
(1)什么是JFrame
代码1:创建主类并让它继承JFrame
图二:相当于我们现在只有一个画板
(2)设置窗口(画板)的大小,以及其他功能
代码2:设置窗口(画板)大小和其他功能
图三:运行程序,可以看到弹出一个窗口,这就是我们的绘图窗口编辑
2、JPanel(画纸)和Graphic(画笔)
(1)什么是JPanel 和 Graphic
代码3:JPanel 以及 paint方法
(2)paint方法
代码4:把g.fillRect(int x1, int y1, int x2, int y2)添加到paint方法里面去。
(3)把JPanel添加到JFrame中(把画纸放到画板上)
图四:这一步相当于把画纸和画笔放到画板上,准备绘画。
代码5:把JPanel添加到JFrame中
图五:代码运行结果,可以看到,我们画了一个矩形(默认颜色为黑色)
一、Java绘图功能介绍
使用Java的绘图功能,可以在Java程序产生的窗口中绘制出我们想要的各种图形(图一)。
图一:使用Java提供的绘图功能绘制坦克大战中的坦克
但是可以见到(图一)使用Java本身自带的功能来进行形状的绘制会比较简陋,因为Java的形状绘制只能画出一些基本的几何图形,如矩形、圆形、线段等。
绘制一个我们想要的复杂的形状可能需要上百个基本图形才能绘制完成。
不过不用担心,Java还提供了直接绘制本地图片的方法,我们可以在其他软件中绘制图片,或者找现成的图片,之后再用Java把本地图片绘制下来就可以了。
二、Java绘图功能的基本结构
在讲解Java绘图的方法之前,我们需要先了解Java的绘图结构。
(即Java绘图的画板、画纸和画笔)
下面我会一边讲解一边写Java绘图的结构框架代码
1、JFrame类(画板)
(1)什么是JFrame
Java提供了JFrame类用来帮助我们进行绘图窗口(画板)的管理。
我们在继承了JFrame的类中可以管理我们的绘图窗口(画板)。
我们可以让主类继承JFrame类,从而让主方法来管理绘图窗口。
代码1:创建主类并让它继承JFrame
package JavaDraw;import javax.swing.*;//这里,我们的主类继承了JFrame这个类,JFrame的功能是负责管理Java绘图中的窗口的功能//这里的主类就相当于我们在Java中绘图的窗口,可以理解为现实中画画的没有画纸的画板子(如图)public class JavaDrawingStruct extends JFrame { public static void main(String[] args) { // }} 这里可以看到我们的JavaDrawStruct主类继承了JFrame,从而可以进行绘图窗口的管理,如绘图窗口的大小就可以在这里设置。问题一:其他窗口功能也可以在JFrame实现吗?
类比现实生活中的绘画,这里继承了JFrame的主类JavaDrawStruct,就是一个没有画纸的画板(如图二)
图二:相当于我们现在只有一个画板
(2)设置窗口(画板)的大小,以及其他功能
代码2:设置窗口(画板)大小和其他功能
public class JavaDrawingStruct extends JFrame { public static void main(String[] args) { // //创建一个新对象自动调用构造器中的方法 JavaDrawingStruct javaDrawingStruct = new JavaDrawingStruct(); } //(无参)构造器 public JavaDrawingStruct() { //设置窗口大小(单位是像素) this.setSize(400, 300); //这个方法的功能是在窗口关闭的时候,Java程序也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //将窗口视为可见,如果不设置为true这里会直接退出程序。(大家可以试一下) this.setVisible(true); }} 见以上代码,我们首先在主类中定义一个无参构造器。
在无参构造器中我们添加设置窗口大小的方法、窗口关闭退出程序的方法和将窗口可视化的方法。
我们知道,我们在创建一个新对象时,会自动调用这个类的构造器中的方法。
即 会调用构造器中设置窗口大小等方法。
所以我们在主方法中创建一个新对象,就设置了窗口。
图三:运行程序,可以看到弹出一个窗口,这就是我们的绘图窗口
步骤总结起来就是:
(1)创建一个主类。
(2)让主类继承JFrame。
(3)新建一个构造器,并在构造器中设置窗口大小、窗口可视化等设置。
(4)在主方法中new(创建)一个主类对象,这一步会自动调用构造器中的我们的设置。
这样我们的窗口就创建好了,大家可以打开idea或者eclipse试一下
至此我们的绘图窗口设置就先告一段落。
2、JPanel(画纸)和Graphic(画笔)
(1)什么是JPanel 和 Graphic
JPanel也是Java中自带的一个类,可以理解为我们绘图的画纸。
而在JPanel中的paint方法里面,有一个参数Graphic g,这个g 就可以理解为我们的画笔。
代码3:JPanel 以及 paint方法
package JavaDraw;import javax.swing.*;import java.awt.*;public class MyPanel extends JPanel { //这里的paint方法中的参数Graphic g相当于我们的画笔 @Override public void paint(Graphics g) { super.paint(g); // }} (2)paint方法
如上面代码3所示,我们新建一个MyPanel类并继承JPanel。
为什么不直接使用JPanel呢?
JPanel中的paint方法不是我们想要的,我们想要绘制一些我们自定义的形状,通过创建MyPanel类并继承JPanel,这样我们就可以实现JPanel中的方法,并自定义。
重写JPanel中的paint方法,并在paint方法中添加我们的绘画逻辑,就可以在我们的画纸中画出我们想画的图形了。
这里的paint方法我们不需要手动在主方法中调用,我们把JPanel添加到JFrame中之后,当我们窗口弹出时,会自动调用paint方法,而paint方法中又有我们刚刚添加的绘画逻辑,所以就会画出我们想画的图形。
我们的绘画逻辑是画笔Graphic g提供的,例如g.fillRect(int x, int y, int width, int height)这个方法可以画出一个有颜色填充的矩形。(其他方法见下)
这里我们把g.fillRect(int x1, int y1, int x2, int y2)添加到paint方法里面去。
代码4:把g.fillRect(int x1, int y1, int x2, int y2)添加到paint方法里面去。
public class MyPanel extends JPanel { //这里的paint方法中的参数Graphic g相当于我们的画笔 @Override public void paint(Graphics g) { super.paint(g); // g.fillRect(50,50,100,100);//画一个矩形 坐标为(50,50),宽为100高为100 //这里的坐标指的是矩形的左上角的顶点坐标 }} (3)把JPanel添加到JFrame中(把画纸放到画板上)
我们回到我们继承了JFrame的主类,把JPanel添加进去,从而可以让我们画的形状在窗口上显示。
图四:这一步相当于把画纸和画笔放到画板上,准备绘画。
代码5:把JPanel添加到JFrame中
public class JavaDrawingStruct extends JFrame { //先声明一个画纸mp 并初始化为空 后面再给mp赋值 private MyPanel mp = null; public static void main(String[] args) { JavaDrawingStruct javaDrawingStruct = new JavaDrawingStruct(); } //(无参)构造器 public JavaDrawingStruct() { //在这里给mp 也就是我们的画纸赋一个对象,这个对象就是我们新new出来的 new MyPanel() mp = new MyPanel(); //添加mp画纸到画板上,这样画出来的东西就可以在窗口(画板)上显示了 this.add(mp); this.setSize(400, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); }} 图五:代码运行结果,可以看到,我们画了一个矩形(默认颜色为黑色)
以上,我们就完成了在Java中绘制一些简单的图形,也带各位认识了Java绘图的框架结构JFrame、JPanel等。
篇幅原因和时间原因,Java中的Graphic画笔中提供的各种绘图的方法,以及如何绘制本地图片和字体,还有JPanel的事件监听,我在下一篇再详细讲吧。
(以上内容是我自学时的总结和输出,难免有一些不准确的地方,非常欢迎大家在评论区与我讨论或者提问。)
*源代码见我本地的资源
下一篇:git怎么取服务器代码?