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

题记:用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类的方法

  1. 画直线:drawLine(int x1, int y1, int x2, int y2)方法用于在点(x1, y1)和(x2, y2)之间画一条线。
  2. 画矩形:drawRect(int x, int y, int width, int height)方法用于画矩形的边框。
  3. 画椭圆:drawOval(int x, int y, int width, int height)方法用于画椭圆的边框。注意,这里的椭圆是根据给定的矩形边框来绘制的。
  4. 填充矩形:fillRect(int x, int y, int width, int height)方法用于填充矩形。
  5. 填充椭圆:fillOval(int x, int y, int width, int height)方法用于填充椭圆。
  6. 设置画笔颜色: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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值