Java实现简单的图形绘制程序(多种图形,多种颜色)

2023-10-27

今天我用GUI图形绘制组件,做了一个图形绘制工具,实现了连续划线、划线效果。图形方面支持直线、圆、椭圆、正方形、长方形的绘制,颜色选择方面支持红色、橙色、黄色、绿色、白色、蓝色、粉色。

效果预览

文件树

在这里插入图片描述

文件准备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这几张图片被存放在了src/image里面。在这里插入图片描述

代码如下

这个图形绘制程序一共有5个java文件构成:
colorButton.java实现了选择颜色按钮的相关功能
lineButton.java实现了选择图形按钮的相关功能
drawingDesk.java实现了画图区域的画图功能
drawingpicture.java实现了将所有功能汇总的并展示的功能
最后还有一个运行文件Testing.java

colorButton.java代码
package test5;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class colorButton extends JPanel implements ActionListener{
	
	JToggleButton btn1 = new JToggleButton("红色");
	JToggleButton btn2 = new JToggleButton("橙色") ;
	JToggleButton btn3 = new JToggleButton("黄色");
	JToggleButton btn4 = new JToggleButton("绿色");
	JToggleButton btn5 = new JToggleButton("白色");
	JToggleButton btn6 = new JToggleButton("蓝色");
	JToggleButton btn7 = new JToggleButton("粉色");
	ButtonGroup bg =new ButtonGroup();
	public colorButton() {
		this.setLayout(new GridLayout(9,1));
		this.setBorder(BorderFactory.createEtchedBorder());
		btn1.setBackground(Color.RED);
		btn2.setBackground(Color.ORANGE);
		btn3.setBackground(Color.YELLOW);
		btn4.setBackground(Color.GREEN);
		btn5.setBackground(Color.WHITE);
		btn6.setBackground(Color.BLUE);
		btn7.setBackground(Color.PINK);
		
		btn1.addActionListener(this);
		btn2.addActionListener(this);
		btn3.addActionListener(this);
		btn4.addActionListener(this);
		btn5.addActionListener(this);
		btn6.addActionListener(this);
		btn7.addActionListener(this);
		this.add(btn1);
		this.add(btn2);
		this.add(btn3);
		this.add(btn4);
		this.add(btn5);
		this.add(btn6);
		this.add(btn7);
		
	}
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==btn1||e.getSource()==btn2||e.getSource()==btn3||e.getSource()==btn4
			||e.getSource()==btn5||e.getSource()==btn6||e.getSource()==btn7) {
			btn1.setSelected(false);
			btn2.setSelected(false);
			btn3.setSelected(false);
			btn4.setSelected(false);
			btn5.setSelected(false);
			btn6.setSelected(false);
			btn7.setSelected(false);
			JToggleButton btn = (JToggleButton)e.getSource();
			btn.setSelected(true);
			}
	
	}
	
}


lineButton.java代码
package test5;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class lineButton extends JPanel implements ActionListener{
	ImageIcon icon1 = new ImageIcon("src/image/直线.png");
	ImageIcon icon2 = new ImageIcon("src/image/圆.png");
	ImageIcon icon3 = new ImageIcon("src/image/tx-正方形.png");
	ImageIcon icon4 = new ImageIcon("src/image/椭圆形.png");
	ImageIcon icon5 = new ImageIcon("src/image/tx-长方形.png");
	
	
	JToggleButton btn1 = new JToggleButton(icon1);
	JToggleButton btn2 = new JToggleButton(icon2);
	JToggleButton btn3 = new JToggleButton(icon3);
	JToggleButton btn4 = new JToggleButton(icon4);
	JToggleButton btn5 = new JToggleButton(icon5);
	
	public lineButton() {
		icon1.setImage(icon1.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT ));
		icon2.setImage(icon2.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT ));
		icon3.setImage(icon3.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT ));
		icon4.setImage(icon4.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT ));
		icon5.setImage(icon5.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT ));
		this.setLayout(new GridLayout(9,1));
		btn1.addActionListener(this);
		btn2.addActionListener(this);
		btn3.addActionListener(this);
		btn4.addActionListener(this);
		btn5.addActionListener(this);
		this.setBorder(BorderFactory.createEtchedBorder());
		this.add(btn1);
		this.add(btn2);
		this.add(btn3); 
		this.add(btn4);
		this.add(btn5);
		
	}
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==btn1||e.getSource()==btn2||e.getSource()==btn3||e.getSource()==btn4
				||e.getSource()==btn5) {
				btn1.setSelected(false);
				btn2.setSelected(false);
				btn3.setSelected(false);
				btn4.setSelected(false);
				btn5.setSelected(false);
				JToggleButton btn = (JToggleButton)e.getSource();
				btn.setSelected(true);
				}
	}

}

drawingDesk.java代码
package test5;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Arrays;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class drawingDesk extends JPanel implements MouseListener, MouseMotionListener{
	private int[] x1 = new int[0]; 
	private int[] y1 = new int[0]; 
	private int[] x2 = new int[0]; 
	private int[] y2 = new int[0]; 
	private Color[] xycolor = new Color[0];
	private int[] xyshape = new int[0];
	
	public lineButton l;
	public colorButton c;
	public JPanel pa= new JPanel();
	public drawingDesk(){
		
		l = new lineButton();
		c = new colorButton();

		this.setLayout(new BorderLayout());
		this.add(l,BorderLayout.WEST);
		this.add(c,BorderLayout.EAST);
		this.add(pa,BorderLayout.CENTER);
		//注册当前组件鼠标监听
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		
	}

	
	@Override
	public void paint(Graphics g) {//第一次显示的时候,由系统自动调用。
		
		super.paint(g);
		int j=0;
		for(int i=0; i < x1.length; i++,j++){
			
			g.setColor(xycolor[j]);
			choiceShape(g,i,xyshape[j]);
			
		}
	}
	
	
	
	//鼠标点击事件
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
	}
	
	//鼠标按压事件
	@Override
	public void mousePressed(MouseEvent e) {
		//对数组进行扩容

		if(l.btn1.isSelected()||l.btn2.isSelected()||l.btn3.isSelected()||l.btn4.isSelected()||l.btn5.isSelected()) {
			x1 = Arrays.copyOf(x1, x1.length + 1);
			y1 = Arrays.copyOf(y1, y1.length + 1);
			x2 = Arrays.copyOf(x2, x2.length + 1);
			y2 = Arrays.copyOf(y2, y2.length + 1);
			xycolor = Arrays.copyOf(xycolor,xycolor.length+1);
			xyshape = Arrays.copyOf(xyshape,xyshape.length+1);
			//获得起始点坐标
			x1[x1.length - 1] = e.getX();
			y1[y1.length - 1] = e.getY();
			xycolor[xycolor.length-1] = getUserColor();

			xyshape[xyshape.length-1] = getUserShape();
		}
	}

	
	//鼠标松开事件
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		//设置结束点坐标
		if(l.btn1.isSelected()||l.btn2.isSelected()||l.btn3.isSelected()||l.btn4.isSelected()||l.btn5.isSelected()) {
			x2[x2.length - 1] = e.getX();
			y2[y2.length - 1] = e.getY();
//			repaint();
		}

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	//鼠标拖动事件(实现拖动显示线条的效果)
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
//		System.out.println(e.getX() + ", " + e.getY());
		if(l.btn1.isSelected()||l.btn2.isSelected()||l.btn3.isSelected()||l.btn4.isSelected()||l.btn5.isSelected()) {
			x2[x2.length - 1] = e.getX();
			y2[y2.length - 1] = e.getY();
			repaint();
		}
		
	}


	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub

	}
	public int getUserShape() {
		if(l.btn1.isSelected()) {	
			return 1;
		}
		else if(l.btn2.isSelected()) {	
			return 2;
		}
		else if(l.btn3.isSelected()) {	
			return 3;
		}
		else if(l.btn4.isSelected()) {	
			return 4;
		}
		else if(l.btn5.isSelected()) {	
			return 5;
		}
		else {
			return 0;
		}

		}

	public Color getUserColor() {

		if(c.btn1.isSelected()) {	
			return Color.RED;
		}
		else if(c.btn2.isSelected()) {	
			return (Color.ORANGE);
		}
		else if(c.btn3.isSelected()) {	
			return (Color.YELLOW);
		}
		else if(c.btn4.isSelected()) {	
			return (Color.GREEN);
		}
		else if(c.btn5.isSelected()) {	
			return (Color.WHITE);
		}
		else if(c.btn6.isSelected()) {	
			return (Color.BLUE);
		}
		else if(c.btn7.isSelected()) {	
			return (Color.PINK);
		}
		else {
			return Color.BLACK;
		}
		
	}
	
    public void choiceShape(Graphics g,int i,int way) {
		if(way==1) {
			g.drawLine(x1[i],y1[i],x2[i],y2[i]);
			
		}else if(way==2) {
			g.drawOval(x1[i],y1[i],(x2[i]-x1[i]),(x2[i]-x1[i]));
			
		}else if(way==3) {
			g.drawRect(x1[i],y1[i],(x2[i]-x1[i]),(x2[i]-x1[i]));
			
		}else if(way==4) {
			g.drawOval(x1[i],y1[i],(x2[i]-x1[i]),(y2[i]-y1[i]));
			
			
		}else if(way==5) {
			g.drawRect(x1[i],y1[i],(x2[i]-x1[i]),(y2[i]-y1[i]));
		}
		else if(way==0) {
			return;
		}
		
	}
	

}

drawingpicture.java代码
package test5;

import javax.swing.*;
import java.awt.*;
public class drawpicture{
	public drawingDesk d;
	JFrame f = new JFrame();
	public drawpicture() {
		d = new drawingDesk();
		f.add(d,BorderLayout.CENTER);
		//设置JFrame的相关属性
		f.setSize(1200,1000);
		f.setTitle("图画工具--draw picture");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
		f.setLocationRelativeTo(null);
//		this.setResizable(false);
//		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
Testing.java代码
package test5;

public class Testing {
	public static void main(String[] args) {
		drawpicture cc=new drawpicture();
	}
}

运行结果

在这里插入图片描述

总结

目前只有图形选择,颜色选择功能,之后还会添加回撤、橡皮擦、线条厚度、线条类型等功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现简单的图形绘制程序(多种图形,多种颜色) 的相关文章

随机推荐

  • windows任务计划程序拒绝访问

    问题现象 在windows任务计划程序中添加脚本程序 执行相应脚本 报了拒绝访问和创建目录需要输入参数问题 问题分析 没有权限执行脚本 问题解决 除了填写相应位置的脚本之外 还需要填写起始于的脚本所在路径
  • Qt系列文章之 Qt Model Class

    Qt Model Class Qt提供了一些列相互继承的Model类体系 Qt的Model类是对用户数据进行体系化封装并提供统一操作接口的一大类模块 Qt提供的模型类十分多 大致可以分为三种 不可实例化的抽象基类 代理模型类和可实例化模型类
  • 【Python习题集5】函数的设计

    函数的设计 一 实验内容 二 实验总结 一 实验内容 1 编写两个函数分别按单利和复利计算利息 根据本金 年利率 存款年限得到本息和和利息 调用这两个函数计算1000元在银行存3年 在年利率是6 的情况下 单利和复利分别获得的本息和和利息
  • 首次使用阿里云云效拉取代码

    首先 需要公司给权限 把你加入公司项目团队 其次 使用公司给的阿里云账号 密码去登录 登录https codeup aliyun com 通过公司人员给开的权限点击加入团队 使用RAM用户登录 输入阿里云账号 点击下一步3 输入阿里云密码
  • Unity与VisualStudio关联配置

    默认已经正确安装UnityHub和VisualStudio 本文环境为Unity2020 3 4f1c1 和 VisualStudio2019 简略 VisualStudio安装VisualStudio Tools for Unity Un
  • jquery 页面刷新

    页面加载时绑定按钮点击事件 function 按钮id click function refresh 点击按钮调用的方法 function refresh window location reload 刷新当前页面 或者下方刷新方法 par
  • SpringBoot——加载测试专用属性

    简单介绍 在之前的时候我们使用过配置文件添加配置 使用过IDEA添加属性配置 使用过命令行添加临时属性配置 在测试中 也可以设置专用于测试的临时配置属性 使用方法 首先打开SpringBoot中默认创建好的测试类 打开之后会在主类上看到一个
  • 微信公众号+Vue+JS-SDK配置注册失败,显示config:fail,Error: 系统错误,错误码:63002,invalid signature等解决方法

    用vue做微信公众号调用js sdk遇到的问题 问题1 JS SDK在IOS中报签名无效invalid signature 解决办法 在VUE路由进去你要操作的页面时进行config接口注入 首先打开工程文件中的router index j
  • Vue计算属性与侦听属性的应用场景

    计算属性中不能进行异步操作 在计算属性中我们不能进行异步操作 例如 不能使用定时器 不能处理 Ajax 请求 div 姓 div
  • 史上最全计算机毕业设计题目1(10万套,大部分全国唯一)

    最新vc图书管理系统 任务书 开题 论文 源码 后缀2a附选题表 rar 最新指纹识别系统 任务书 开题 论文 源码 后缀2b附选题表 rar 原创java图书管理系统 任务书 论文 后缀2b附选题表 rar 原创毕业设计网上选题系统 任务
  • Android开发中常见的内存泄漏情况和解决办法

    什么是内存泄漏 答 在Android程序开发中 当一个对象已经不需要再使用了 本该被回收时 而另外一个正在使用的对象持有它的引用从而导致它不能被回收 这就导致本该被回收的对象不能被回收而停留在堆内存中 内存泄漏就产生了 内存泄漏的危害 答
  • 最大类间方差法(大津法OTSU)

    算法介绍 最大类间方差法是1979年由日本学者大津提出的 是一种自适应阈值确定的方法 又叫大津法 简称OTSU 是一种基于全局的二值化算法 它是根据图像的灰度特性 将图像分为前景和背景两个部分 当取最佳阈值时 两部分之间的差别应该是最大的
  • jdbc驱动和mysql版本的对应关系引起的Could not create connection to database server

    前言 之前在docker上部署项目时发现个问题 在本地运行时一切正常 打包部署到docker上的tomcat时一直报错无法连接数据库 期初认为是数据库远程权限的问题 各种方法试了都不管用 后来搜索过程中看到有帖子说可能是jdbc版本和mys
  • PCB走线到底能承载多大电流

    想必刚入行硬件设计领域的小白 一定存在过这种困惑 即电流与PCB走线宽度的关系 不仅小白想知道这种关系 就连有些工作多年的老司机有时也存在一定的困惑 在设置线宽时 往往是根据经验来选择 然而当电流稍作大幅度的变化 对于线宽就很难拿捏住了 在
  • 图像增强小程序——Img+

    文章目录 前言 软件 1 界面 2 软件 前言 最近闲来无事 用PyQt5写了一个图像增强查看器 可以实时查看图像增强结果 集成了常用的图像增强方式 包括反转 平移 旋转 缩放 裁剪加噪声 亮度 饱和度 颜色反转 直方图均衡 色彩平衡 Cu
  • Android组件化方案

    1为什么要项目组件化 2如何组件化 3组件化实施流程 1组件模式和集成模式的转换 2组件之间AndroidManifest合并问题 3全局Context的获取及组件数据初始化 4library依赖问题 5组件之间调用和通信 6组件之间资源名
  • socket编程出现errno:【10061】

    出现Errno10061 是因为目标主机主动拒绝 连接不能建立 这通常是因为试图连接到一个远程主机上不活动的服务 如没有服务器应用程序处于执行状态 解决方法 1 你先启动server 看是否可以正常启动 2 因为是基于TCP的 所以你试试t
  • VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4

    在使用Visual Studio 2022 MinGW CMake作为开发环境时 如果项目中使用了Protobuf 则在CMake运行时 可能会出现Protobuf compiler version 23 4 doesn t match l
  • 黑苹果系统完全移植新硬盘

    1 新硬盘格式化 1 1将新硬盘连接电脑 打开黑苹果系统下的磁盘工具 1 2选择新硬盘 点击抹掉 名称自己起 mac OS 文件格式 APFS 1 3点击确认 2 安装Carbon Copy Cloner软件 2 1 软件链接链接 http
  • Java实现简单的图形绘制程序(多种图形,多种颜色)

    今天我用GUI图形绘制组件 做了一个图形绘制工具 实现了连续划线 划线效果 图形方面支持直线 圆 椭圆 正方形 长方形的绘制 颜色选择方面支持红色 橙色 黄色 绿色 白色 蓝色 粉色 效果预览 文件树 文件准备 这几张图片被存放在了src