题记:用Java绘制你的创意世界
大家好!欢迎来到今天的博客分享。在编程的世界里,语言如同画笔,而算法则是我们挥洒创意的画布。今天,我将带大家一起探索如何用Java这门强大的编程语言来实现画图功能,让你在代码的世界里自由挥洒创意,绘制出属于自己的精彩画卷。
Java,作为一门广泛应用的编程语言,不仅拥有强大的跨平台能力,还内置了丰富的图形绘制库,使得我们能够轻松实现各种绘图需求。无论你是编程初学者,还是有一定经验的开发者,通过本文的学习,你都将能够掌握Java绘图的基本技巧,为你的程序增添生动的图形元素。
接下来,让我们一起踏入Java绘图的奇妙旅程,从基础开始,逐步解锁Java绘图的奥秘吧!
目录
一.简介
1.理解坐标体系
1.1坐标原点与单位
1.2坐标表示
2.掌握绘图原理
2.1Component类的paint方法
3.使用Graphics类的方法
二.演示环节
2.1结构
2.2代码演示
一.简介
1.理解坐标体系
1.1坐标原点与单位
Java的坐标原点位于左上角,以像素为单位。水平向右为X轴的正方向,竖直向下为Y轴的正方向。
1.2坐标表示
在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。(和高中的建系是不是很像呢)
2.掌握绘图原理
2.1Component类的paint方法
Component类提供了paint(Graphics g)方法,用于绘制组件的外观。当组件第一次在屏幕显示时,或者窗口大小发生变化、窗口最小化再最大化、repaint()方法被调用时,paint方法会被自动调用。(虽然有一些枯燥,但很重要,今天图形化的类都是直接或间接继承Component类)
3.使用Graphics类的方法
画直线:drawLine(int x1, int y1, int x2, int y2)方法用于在点(x1, y1)和(x2, y2)之间画一条线。画矩形:drawRect(int x, int y, int width, int height)方法用于画矩形的边框。画椭圆:drawOval(int x, int y, int width, int height)方法用于画椭圆的边框。注意,这里的椭圆是根据给定的矩形边框来绘制的。填充矩形:fillRect(int x, int y, int width, int height)方法用于填充矩形。填充椭圆:fillOval(int x, int y, int width, int height)方法用于填充椭圆。设置画笔颜色:setColor(Color c)方法用于设置画笔的颜色。
二.演示环节
首先介绍一下我们的目标:在画图板上可以用鼠标绘制不同颜色的直线,圆,实心圆,矩形,实现矩形,等腰三角形等一些基本图形。
2.1结构
Ⅰ.一个界面类:
需要一个窗体 JFrame
Ⅱ.一个监听类:
需要实现 MouseListener 接口,重写其中的方法
●获取鼠标操作时的坐标: MouseEvent e 参数
int x = e.getX();
int y = e.getY();
Ⅲ.图形处理器:
Graphics - 图形 用来渲染需要显示到屏幕上的内容
1: 需要从可视化组件上获取 比如:窗体对象,或者面板对象
Graphics g = jf.getGraphics();
2:必须在可视化之后获取
3:应该在鼠标操作后去使用
2.2代码演示
1.创建DrawPad类和监听类DrawListener。
2.如果要实现选择绘制的图形和颜色,我们要在DrawPad类中创建两个数组,如下:
String[] btTexts = {"直线","矩形","圆","实心矩形","等腰三角形","实心圆"};//定义一些图形Color[] colors = {Color.BLACK, Color.BLUE, Color.PINK, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.YELLOW , Color.WHITE, Color.RED, Color.ORANGE};//定义一些颜色
2.创建监听类的对象
Drawlistener dl = new Drawlistener();
3.监听类需要实现两个接口ActionListener
和MouseListener,
用于处理按钮点击和鼠标事件,注意要实现接口的全部方法 。
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class DrawListener implements ActionListener, MouseListener { // 实现 ActionListener 接口的 actionPerformed 方法 @Override public void actionPerformed(ActionEvent e) { // 在这里处理动作事件 System.out.println(""); } // 实现 MouseListener 接口的 mouseClicked 方法 @Override public void mouseClicked(MouseEvent e) { // 在这里处理鼠标点击事件 System.out.println("点击"); } // 实现 MouseListener 接口的 mousePressed 方法 @Override public void mousePressed(MouseEvent e) { // 在这里处理鼠标按下事件 System.out.println("按下"); } // 实现 MouseListener 接口的 mouseReleased 方法 @Override public void mouseReleased(MouseEvent e) { // 在这里处理鼠标释放事件 System.out.println("释放"); } // 实现 MouseListener 接口的 mouseEntered 方法 @Override public void mouseEntered(MouseEvent e) { // 在这里处理鼠标进入组件区域事件 System.out.println("进入"); } // 实现 MouseListener 接口的 mouseExited 方法 @Override public void mouseExited(MouseEvent e) { // 在这里处理鼠标离开组件区域事件 System.out.println("离开"); }
4.这里教大家各种图形绘制的方法(x1,x2,y1,y2分别是鼠标按下和松开的坐标)
矩形可以利用四条直线来绘制public void drawRect(int x1, int y1, int x2, int y2){ g.drawLine(x1,y1,x2,y1); g.drawLine(x1,y1,x1,y2); g.drawLine(x2,y1,x2,y2); g.drawLine(x1,y2,x2,y2); }
等腰三角形也可以利用直线绘制 public void drawisoscelestriangle(int x1, int y1, int x2, int y2){ int m = (x1+x2)/2; //顶点的横坐标 g.drawLine(m,y1,x1,y2); g.drawLine(m,y1,x2,y2); g.drawLine(x1,y2,x2,y2); } }
圆形我们可以使用Graphics中的方法drawOval,借助直径和圆心直接绘制 int width = x2 - x1;int height = y2 - y1;int diameter = Math.min(width, height);g.drawOval(x1,y1,diameter,diameter);
5.我们需要创建一些button来显示我们的选项
// 遍历btTexts数组,为每个字符串创建一个按钮,并添加到窗口中 for (int i = 0; i < btTexts.length; i++) { JButton btn = new JButton(btTexts[i]); btn.addActionListener(dl); // 将dl作为按钮的动作监听器 jf.add(btn); // 将按钮添加到窗口中 } // 遍历colors数组,为每个颜色创建一个按钮,并添加到窗口中 for (int i = 0; i < colors.length; i++) { JButton btn = new JButton(); btn.setBackground(colors[i]); // 设置按钮的背景色 btn.setPreferredSize(new Dimension(30, 30)); // 设置按钮的首选大小 btn.addActionListener(dl); // 将dl作为按钮的动作监听器 jf.add(btn); // 将按钮添加到窗口中 }
6.思考:如何来判断点击的是图形按钮还是颜色按钮?(用到字符串来判断,具体方法展示在下面的代码中)
接下来将这些融合起来,就是我们今天的目标啦,以下是完整代码的分享// 定义一个名为DrawPad的公开类 public class DrawPad { // 声明并初始化一个Drawlistener类型的变量dl,用于处理事件 Drawlistener dl = new Drawlistener(); // 定义一个字符串数组,包含按钮上的文本 String[] btTexts = {"直线", "矩形", "圆", "实心矩形", "等腰三角形", "实心圆"}; // 定义一个Color数组,包含可选的颜色 Color[] colors = {Color.BLACK, Color.BLUE, Color.PINK, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.YELLOW, Color.WHITE, Color.RED, Color.ORANGE}; // 定义一个公开的方法showUI,用于创建并显示用户界面 public void showUI() { // 创建一个JFrame实例,作为窗口 JFrame jf = new JFrame(); // 设置窗口的标题 jf.setTitle("画图板1.0"); // 设置窗口的尺寸 jf.setSize(1000, 1000); // 设置默认的关闭操作为关闭应用程序 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 将窗口居中显示在屏幕上 jf.setLocationRelativeTo(null); // 设置窗口的布局管理器为FlowLayout jf.setLayout(new FlowLayout()); // 遍历btTexts数组,为每个字符串创建一个按钮,并添加到窗口中 for (int i = 0; i < btTexts.length; i++) { JButton btn = new JButton(btTexts[i]); btn.addActionListener(dl); // 将dl作为按钮的动作监听器 jf.add(btn); // 将按钮添加到窗口中 } // 遍历colors数组,为每个颜色创建一个按钮,并添加到窗口中 for (int i = 0; i < colors.length; i++) { JButton btn = new JButton(); btn.setBackground(colors[i]); // 设置按钮的背景色 btn.setPreferredSize(new Dimension(30, 30)); // 设置按钮的首选大小 btn.addActionListener(dl); // 将dl作为按钮的动作监听器 jf.add(btn); // 将按钮添加到窗口中 } // 设置窗口为可见 jf.setVisible(true); // 将dl添加为窗口的鼠标监听器 jf.addMouseListener(dl); dl.g = jf.getGraphics(); // 将窗口的图形上下文赋给dl的g属性 } // Java程序的入口点 public static void main(String[] args) { // 创建DrawPad实例,并调用showUI方法来显示用户界面 new DrawPad().showUI(); } }
import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; // 定义一个公开的类 Drawlistener,它实现了 MouseListener 和 ActionListener 接口 public class Drawlistener implements MouseListener, ActionListener { // 声明一个 Graphics 类型的变量 g,用于在组件上绘图 Graphics g; // 这四个整型变量用于存储绘图时鼠标按下的位置和释放的位置 int x1, y1, x2, y2; // 声明并初始化一个字符串变量 type,用于存储当前选择的绘图类型(如直线、矩形等) String type = " "; // 重写 ActionListener 接口的 actionPerformed 方法,用于处理动作事件 @Override public void actionPerformed(ActionEvent e) { // 获取动作事件的命令字符串并打印 String ac = e.getActionCommand(); System.out.println("点击了:" + ac); // 如果动作命令为空字符串,则从事件源(假设为一个按钮)获取背景颜色,并设置绘图颜色为该颜色 // 否则,将动作命令设置为当前的绘图类型 if (ac.equals("")) { JButton btn = (JButton) e.getSource(); // 把内容传给按钮 Color color = btn.getBackground(); g.setColor(color); } else { type = ac; } } // 重写 MouseListener 接口的 mouseClicked 方法,用于处理鼠标点击事件 @Override public void mouseClicked(MouseEvent e) { // 打印“点击”表示鼠标点击事件发生 System.out.println("点击"); } // 重写 MouseListener 接口的 mousePressed 方法,用于处理鼠标按下事件 @Override public void mousePressed(MouseEvent e) { // 打印“按下”,获取鼠标按下的位置,并存储到 x1 和 y1 System.out.println("按下"); int x = e.getX(); int y = e.getY(); System.out.println("x =" + x + " y =" + y); x1 = x; y1 = y; } // 重写 MouseListener 接口的 mouseReleased 方法,用于处理鼠标释放事件 @Override public void mouseReleased(MouseEvent e) { // 打印“释放”,获取鼠标释放的位置,并存储到 x2 和 y2 System.out.println("释放"); int x = e.getX(); int y = e.getY(); System.out.println("x =" + x + " y =" + y); x2 = x; y2 = y; // 根据当前选择的绘图类型绘制相应的形状 if (type.equals("直线")) { g.drawLine(x1, y1, x2, y2); // 绘制直线 } else if (type.equals("矩形")) { drawRect(x1, y1, x2, y2); // 绘制矩形 } else if (type.equals("圆")) { int width = x2 - x1; int height = y2 - y1; int diameter = Math.min(width, height); g.drawOval(x1, y1, diameter, diameter); // 绘制圆 } else if (type.equals("实心圆")) { int width = x2 - x1; int height = y2 - y1; int diameter = Math.min(width, height); g.fillOval(x1, y1, diameter, diameter); // 绘制实心圆 } else if (type.equals("等腰三角形")) { drawisoscelestriangle(x1, y1, x2, y2); // 绘制等腰三角形 } } // 重写 MouseListener 接口的 mouseEntered 方法,用于处理鼠标进入组件的事件 @Override public void mouseEntered(MouseEvent e) { // 打印“进入” System.out.println("进入"); } // 重写 MouseListener 接口的 mouseExited 方法,用于处理鼠标离开组件的事件 @Override public void mouseExited(MouseEvent e) { // 打印“离开” System.out.println("离开"); } // 定义一个方法 drawRect,用于绘制矩形 public void drawRect(int x1, int y1, int x2, int y2) { g.drawLine(x1, y1, x2, y1); // 绘制矩形上边 g.drawLine(x1, y1, x1, y2); // 绘制矩形左边 g.drawLine(x2, y1, x2, y2); // 绘制矩形右边 g.drawLine(x1, y2, x2, y2); // 绘制矩形下边 } // 定义一个方法 drawisoscelestriangle,用于绘制等腰三角形 public void drawisoscelestriangle(int x1, int y1, int x2, int y2) { int m = (x1 + x2) / 2; // 计算等腰三角形底边的中点 g.drawLine(m, y1, x1, y2); // 绘制等腰三角形的左边 g.drawLine(m, y1, x2, y2); // 绘制等腰三角形的右边 g.drawLine(x1, y2, x2, y2); // 绘制等腰三角形的底边 } }
细心的小伙伴会发现,为什么没有填充矩形呢?这个图形的实现方法和其他的都类似,交给同学们自己完成哦,掌握了的小伙伴可以思考一下梯形,直角梯形,等腰梯形,以及其他多边形。
随着我们一步步地探索和实践,这个从零开始的画图板项目终于迎来了它的完美落幕。从最初的简单线条,到如今的丰富形状和多彩颜色,每一步都凝聚了你的创意与努力。而在这个过程中,你也从一个对Java编程略知一二的初学者,成长为一个能够独立完成图形界面应用的开发者。
但请记住,这仅仅是一个开始。虽然我们的画图板已经具备了基本的绘图功能,但创意的边界是无穷无尽的。你可以继续探索Java的更多高级特性,如动画效果、图层管理、甚至是与互联网的交互,来进一步提升你的画图板功能。
同时,也希望你能够将这次编程经历视为一次宝贵的财富。它不仅让你掌握了Java编程的技能,更重要的是,它教会了你如何将自己的创意转化为现实,如何用代码来描绘你心中的梦想。
所以,让我们带着这份成就感和自信心,继续前行吧!在未来的日子里,用Java绘制更多的精彩,让创意在你的指尖无限延伸,共同创造属于我们的美好未来!
下面是作者的微信,欢迎有问题的同学来提问,也欢迎有其他想法的同学来分享。