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

CSDN 2024-10-22 14:35:02 阅读 75

题记:用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类中创建两个数组,如下:

<code>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

 

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。