swing快速入门(二十四)绘画板-可调色

注释很详细,直接上代码

上一篇

Look here~
听我说完再继续看更容易理解:
如果说用之前的绘图方法写一个绘画板你会怎么做?重绘会让之前的内容消失呀,用各种数据结构记录每个像素点的位置或颜色?嘶,感觉很麻烦对吧。位图便解决了这个问题,相当于给你一个图层进行绘画,画完每一步都会实时显示在绘画区域,这样就实现了像素点的记录。下面来实践一下~

新增内容

1. 使用位图记录绘画痕迹

2. 继承Canvas类,重写paint方法显示位图

3.鼠标移动响记录上次与当此位置进行连线化曲为直

4.处理鼠标左键刚按下时没有上一次坐标的情况

5.特判鼠标右键的菜单响应情况

package swing21_30;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;public class swing_test_22 {private Frame frame =new Frame("手绘程序");//定义画图区的宽高private static final int WIDTH = 600;private static final int HEIGHT = 600;//记录鼠标上一次拖动过程中的位置private int prex=-1;private int prey=-1;//定义一个右键菜单,用于设置画笔的颜色private PopupMenu colorMenu=new PopupMenu("");private MenuItem redItem=new MenuItem("红色");private MenuItem greenItem=new MenuItem("绿色");private MenuItem blueItem=new MenuItem("蓝色");//定义一个变量记录当前画笔颜色private Color forceColor=Color.BLACK;//创建一个BufferImage对象,用于绘制图形private BufferedImage image=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB表示使用RGB颜色模型//通过位图,获取关联的Graphics对象Graphics g=image.getGraphics();//自定义一个类,继承Canvas类,重写paint方法class MyCanvas extends Canvas{@Overridepublic void paint(Graphics g){g.drawImage(image,0,0,null);//绘制图片}}//创建一个画图区MyCanvas drawArea=new MyCanvas();public void init(){//组装视图//创建监听器ActionListener listener=new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取控件文本String actionCommand=e.getActionCommand();switch (actionCommand){case "红色":forceColor=Color.RED;break;case "绿色":forceColor=Color.GREEN;break;case "蓝色":forceColor=Color.BLUE;break;}}};//注册监听器redItem.addActionListener(listener);greenItem.addActionListener(listener);blueItem.addActionListener(listener);//组装菜单colorMenu.add(redItem);colorMenu.add(greenItem);colorMenu.add(blueItem);//将菜单设置给绘图区域drawArea.add(colorMenu);//鼠标抬起响应drawArea.addMouseListener(new MouseAdapter() {@Overridepublic void mouseReleased(MouseEvent e) {//特判触发右键菜单的情况boolean popupTriggered=e.isPopupTrigger();if(popupTriggered){//显示右键菜单colorMenu.show(drawArea,e.getX(),e.getY());}//重置prex和prey的值prex=-1;prey=-1;}});//设置背景为白色g.setColor(Color.WHITE);g.fillRect(0,0,WIDTH,HEIGHT);//通过鼠标移动监听器drawArea.addMouseMotionListener(new MouseAdapter() {@Overridepublic void mouseDragged(MouseEvent e) {//获取当前鼠标位置int x=e.getX();int y=e.getY();if(prex!=-1&&prey!=-1){g.setColor(forceColor);//根据鼠标拖动的距离,绘制线条g.setColor(forceColor);g.drawLine(prex,prey,x,y);};//修正prex和prey的值prex=e.getX();prey=e.getY();//因为在位图上完成了但是还未显示在绘图区,这里需要刷新一下绘图区//刷新绘图区drawArea.repaint();}});//设置最佳大小drawArea.setPreferredSize(new Dimension(WIDTH,HEIGHT));frame.add(drawArea);//设置最佳大小且可见frame.pack();frame.setVisible(true);}public static void main(String[] args) {new swing_test_22().init();}
}

演示效果:

右键显示颜色选项

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293735.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择出最适合的backbone模型?图像分类模型性能大摸底

到2023年图像分类backbone模型已经拓展到了几十个系列,而有的新算法还在采样vgg、resnet做backbone,比如2022年提出的GDIP-YOLO还在用VGG16做IA参数预测,那是在浪费计算资源并限制了模型性能的提升,应该将目光放到现在的最新模型中…

Mac使用Vmware Fusion虚拟机配置静态ip地址

一、设置虚拟机的网络为NAT 二、修改虚拟机的网络适配器网络 1、查看虚拟机的网卡 cd /etc/sysconfig/network-scripts#有些系统显示的是ens33,ens160等等 #不同的系统和版本,都会有所不同 #Centos8中默认是ens160,在RedHat/Centos7则为ens33 2、查看网…

绩效面谈-大公司提高绩效的必杀技

绩效面谈是一种人力资源管理工具,旨在评估员工绩效并为其提供反馈。其意义包括: 为提高绩效制定具体的目标和计划。通过与员工讨论绩效表现,管理人员和员工可以确定明确的目标和方向,以实现更高的绩效水平。 帮助员工理解工作环…

企业级“RAS”的数据平台如何炼成?

从“看报表”到“数据分析结果直接投入运营”,数字化正在深入企业经营,数据系统正在成为核心生产系统。相应的,企业对“作业挂了”、“系统崩了”、“算不出来”的容忍度越来越低——只有足够稳定、可靠、专业的数据系统,才能及时…

广州华锐互动:船舶安全事故3D虚拟还原系统模拟海上事故发生,帮助员工提高安全意识

随着科技的不断发展,人们对于安全问题的关注度越来越高。在船舶行业中,由于船舶的特殊性和复杂性,船舶事故的发生往往会造成严重的人员伤亡和财产损失。为此,船舶安全事故3D虚拟还原系统应运而生,为船舶安全管理和培训…

微信开发工具修改编译一直报Cannot read property ‘call‘ of undefined?

我个人的解决方法 更新HbuilderX和微信小程序开发者工具到最新版,微信开发者工具-设置-本地设置-调试基础库也换成最新的3.2.4,打开又报错, 把manifest.json文件内的 “mp-weixin” : {“libVersion”: “latest”}配置上就好了 如果不能解…

朱卫明《酒吧情歌》:独立创作,多元音乐元素融合

朱卫明《酒吧情歌》:独立创作,多元音乐元素融合,成就“明式流行音乐”经典 朱卫明,身为音乐制作人和歌手的他,才华横溢,创作无数。2022年1月31日,他推出了一首全新的单曲《酒吧情歌》。从作曲、…

SpringBoot对接支付宝完成扫码支付

文章目录 1、支付方式选择2、交互流程3、对接准备1)加密解密 签名验签2)沙箱环境3)内网穿透 4、二维码5、下单6、异步通知回调7、查询支付结果8、退款9、通用版SDK 需求:系统A对接支付宝,实现支持用户扫码支付 1、支…

第二证券:降息脚步渐近 银行板块估值望受提振

昨日,A股强势反弹,三大股指早盘探底回升,午后发力走高,深成指涨逾1%,创业板指一度涨超2%;北证50指数大幅回落,一度跌近8%;到收盘,沪指涨0.57%报2918.71点,深成…

Java网络编程---UDP

客户端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建客户端对象DatagramSocket socket new Datagra…

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上答疑&#x…

Tekton

一. 概念 Tekton 官网 Github Tekton 是一种用于构建 CI/CD 管道的云原生解决方案,它由提供构建块的 Tekton Pipelines,Tekton 作为 Kubernetes 集群上的扩展安装和运行,包含一组 Kubernetes 自定义资源,这些资源定义了您可以为…