当前位置:首页 » 《关于电脑》 » 正文

太理泽哥教你学Java:从零开始打造你的个性化画图板

14 人参与  2024年10月15日 08:01  分类 : 《关于电脑》  评论

点击全文阅读


题记:用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.监听类需要实现两个接口ActionListenerMouseListener,用于处理按钮点击和鼠标事件,注意要实现接口的全部方法 。  

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绘制更多的精彩,让创意在你的指尖无限延伸,共同创造属于我们的美好未来!

 

下面是作者的微信,欢迎有问题的同学来提问,也欢迎有其他想法的同学来分享。

bc1a38b3ed6443c4a7be6b13a6a7aea5.jpeg

 

 


点击全文阅读


本文链接:http://zhangshiyu.com/post/171925.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1