利用Java实现数据矩阵的可视化

news/2024/5/26 19:52:10/文章来源:https://blog.csdn.net/weixin_42428226/article/details/136707837

1. 引言

在进行工程开发时,通常需要在窗口的某个区域将有效数据形象化地呈现出来,例如:对于某一区域的高程数据以伪色彩的方式呈现出高度的变化,这就需要解决利用Java进行数据呈现的问题。本文将建立新工程开始,逐步地介绍利用容器实现数据呈现的方法。

2. 建立新工程

在Esclipse中选择菜单:File-->New-->Project

在弹出的对话框中,选择Java Project

随后,在新的窗口中设置工程名称与工程存储位置

在这里需要说明的是,一般情况下,工程的存储位置不建议使用缺省位置,建议根据自己的实际情况,指定工程存储的路径,这样有利于后期对工程文件的管理与维护。

工程设置好后,在Eclipse中会呈现下图形式,在Eclipse的左侧将新工程以目录形式呈现。

通过文件资源管理器,可以在电脑的软件系统中找到如下目录。后期编写的软件都会存储在这个目录的相应子目录中。也可以在这个目录内建立本工程独特的目录,用于对某些特殊类型文件的管理。

至此,一个新的工程框架已经构建,但其内尚无任何可编辑的代码,此时需要建立相应的类文件,以便构造出程序的入口。

右击工程PaintPic下的src目录,在弹出鼠标菜单中选择:New --> Class

设置类文件的名称

注意,这里的Source folder建议采用其默认值,不需要修改。

将新的类文件PaintMain加入工程后,该文件名称会出现在src目录下的缺省包内,同时在编码窗口也将该文件打开,可以进行编辑。

此时,在电脑的文件系统中,工程目录中的src子目录下会出现文件PaintMain.java

在建立类文件时,可以发现文件PaintMain.java被放置在工程的缺省包内。当进行一个较复杂项目的开发时,工程中会涉及大量的java文件,为了能够对文件进行分类管理,通常需要根据文件的分类建立不同的包,并将相应的文件放置在包内。

建立新的包。右击src目录,在弹出的鼠标菜单中选择:New --> Package

在弹出的窗口中,给出包的名称

同样,这里的Source folder建议采用其默认值,不需要修改。

点击完成后,会在工程PaintPic的src目录下生成一个新的包MainPackage

同时,在电脑的文件系统中,在工程PaintPic目录的src子目录下会生成一个名为MainPackage的新子目录。 

建立新的包后,可以直接将java文件拖到包内,也可选择右击包,建立新的类文件。

至此,一个工程的基本架构已经设置完成,后续将进行代码的编写。

3. 编写窗口文件

首先设置程序入口,在PaintMain类中增加代码

public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {PaintMain window = new PaintMain();} catch (Exception e) {e.printStackTrace();}}});
}

代码中的PaintMain window = new PaintMain();指向程序PaintMain()。

在PaintMain()中进行窗口信息的设置。

public PaintMain() {// 设置应用的主窗口JFrame frame = new JFrame();// 设置窗口位置及大小frame.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);// 将窗口最大化frame.setExtendedState(JFrame.MAXIMIZED_BOTH);// 设置窗口关闭时即退出工程frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口可见frame.setVisible(true);// 设置背景容器JPanel contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));contentPane.setLayout(null);contentPane.setSize(frame.getContentPane().getSize());frame.setContentPane(contentPane);}

在PaintMain()中,首先设置框架frame的相关参数,随后在框架frame中设置背景容器contentPane。注意,在框架中一定要有容器,后续的所有内容都需要以这个背景容器为基础建立。

此时,运行代码即可获得一个空白的窗口。

有了窗体后,我们需要在这个窗体的指定区域将有效数据可视化。这个区域也需要用容器来处理,因此,建立新的类Backgnd用于生成相应的容器。

public class Backgnd extends JPanel {public Backgnd() {// 设置JPanel的宽与高int width_JPanel = 1000;int height_JPanel = 1000;this.setSize(width_JPanel, height_JPanel);// 设置JPanel的左上角位置this.setLocation(30, 50);// 设置JPanel的背景颜色this.setBackground(Color.RED);}
}

在这个类中,定义了容器的宽度、高度(以像素为单位)、其左上角的位置、及背景颜色。

在Backgnd中完成对容器的设置后,还需要在PaintMain中将Backgnd类声明,并加入到背景容器contentPane中。

public PaintMain() {// 设置应用的主窗口JFrame frame = new JFrame();// 设置窗口位置及大小frame.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);// 将窗口最大化frame.setExtendedState(JFrame.MAXIMIZED_BOTH);// 设置窗口关闭时即退出工程frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口可见frame.setVisible(true);// 设置背景容器JPanel contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));contentPane.setLayout(null);contentPane.setSize(frame.getContentPane().getSize());frame.setContentPane(contentPane);// 定义并加载地图显示窗口Backgnd backPanel = new Backgnd();// 将地图窗口加入到背景容器中contentPane.add(backPanel);}

再次运行工程,其效果如下:

由运行的结果可以看出,在工程窗体的左上部区域出现了一块红色背景的方块,这就是将来用于可视化数据的区域。

4.生成数据文件,并将其可视化

首先产生一组数据,数据的尺寸应与容器Backgnd的尺寸相当。确保每个像素点与数据中的每一位一一对应。

public static int[][] GenerateData(int width_Image, int height_Image){int[][] imageData = new int[width_Image][height_Image];double omega = Math.PI*2/500;for (int w = 0; w < width_Image; w++){for (int h = 0; h < height_Image; h++){imageData[w][h] = (int) (500*Math.sin(omega * w)*Math.cos(omega * h));}}return imageData;
}

这里是生成一个简单的波动数据。在实际中,这里应该是有效数据的整合代码。

随后,需要将数据转换为可进行图像显示的BufferedImage格式。

public static BufferedImage DrawImageBackground(int width_Image, int height_Image, int[][] imageData) {BufferedImage imageBackground = new BufferedImage(width_Image, height_Image, BufferedImage.TYPE_INT_RGB);// 获取数据中的最大值与最小值int d_max = 0;int d_min = 0;for (int wn = 0; wn < width_Image; wn++){for (int hn = 0; hn < height_Image; hn++) {d_max = Math.max(d_max, imageData[wn][hn]);d_min = Math.min(d_min, imageData[wn][hn]);}}// 为数据点赋颜色float r, g, b, temp;for (int wn = 0; wn < width_Image; wn++){for (int hn = 0; hn < height_Image; hn++) {// 颜色图设置temp = ((float) (imageData[wn][hn] - d_min)) / ((float) (d_max - d_min));r = temp;g = 1-temp;b = (float) (Math.sin(2*Math.PI*temp)*0.5 + 0.5);// 将颜色赋值给数据点imageBackground.setRGB(wn, hn, new Color(r, g, b).getRGB());}}return imageBackground;
}

在转换的过程中,需要对数据逐点进行着色。由于颜色参数r、g、b的取值范围是[0,1],所以需要对数据的范围进行归一化,而后再根据不同的着色方案对参数进行赋值。

代码中,首先通过for循环实现对数据中最小值d_min与最大值d_max的提取。而后,再利用for循环逐一对各个数据点的值进行归一化。利用归一化的值,按着不同的着色方案设置相应的r、g、b值。

产生数据的程序GenerateData和将数据转换为特定格式的程序DrawImageBackground可以放置在同一个类文件内。

至此,可以将上述两程序加载到Backgnd类中,以使得数据能够在相应的容器内呈现。

public class Backgnd extends JPanel {BufferedImage imageBackground;	// 初始化背景图public Backgnd() {// 设置JPanel的宽与高int width_JPanel = 1000;int height_JPanel = 1000;this.setSize(width_JPanel, height_JPanel);// 设置JPanel的左上角位置this.setLocation(30, 50);// 设置JPanel的背景颜色this.setBackground(Color.RED);int[][] imageData = DataProcess.GenerateData(1000, 1000);imageBackground = DataProcess.DrawImageBackground(width_JPanel, height_JPanel, imageData);}public void paintComponent(Graphics g) { // 重载窗口组件的paint()方法// 1.调用父类函数完成初始化任务// 这句话不能少super.paintComponent(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.drawImage(imageBackground, 0, 0, this);}}

运行工程,得到下面的结果。

此至,完成了数据矩阵可视化的全部任务。

5. 结束语

本文只是给出了一个简单的数据矩阵可视化的例程,根据工程的实际情况,可以修改数据生成代码,着色代码等,形成工程所需的形式。

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

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

相关文章

VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!

写在前面&#xff1a;在Windows系统下使用VScode时可以很舒服的使用flake8和yapf&#xff0c;但是在ssh远程开发树莓派时&#xff0c;我却用不了&#xff0c;总是出现问题。当时我就开始了漫长的探索求知之路。中间也请教过许多大佬&#xff0c;但是他们就讲“能用不就行了&…

LabVIEW电磁阀特性测控系统

LabVIEW电磁阀特性测控系统 电磁阀作为自动化工程中的重要组成部分&#xff0c;其性能直接影响系统的稳定性和可靠性。设计一种基于LabVIEW的电磁阀特性测控系统&#xff0c;通过高精度数据采集和智能化控制技术&#xff0c;实现电磁阀流阻、响应时间及脉冲特性的准确测量和分…

【MySQL性能优化】- 一文了解MVCC机制

MySQL理解MVCC &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff…

docker部署springboot jar包项目

docker部署springboot jar包项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…

应急响应实战笔记03权限维持篇(6)

0x00 前言 在渗透测试中&#xff0c;有三个非常经典的渗透测试框架----Metasploit、Empire、Cobalt Strike。 那么&#xff0c;通过漏洞获取到目标主机权限后&#xff0c;如何利用框架获得持久性权限呢&#xff1f; 0x01 MSF权限维持 使用MSF维持权限的前提是先获得一个met…

开关电源的线性调整率是什么?怎么检测线性调整率?

开关电源线性调整率 开关电源线性调整率是指输入电压在额定范围内变化时&#xff0c;开关电源输出电压随之变化的比率。线性调整率对开关电源的电压稳定性有着重要影响&#xff0c;通常开关电源的线性调整率在1%~5%之间。线性调整率越小&#xff0c;说明电压越稳定&#xff1b;…

Maven编译:Failed to execute goal……Fatal error compiling

问题描述 mvn编译报错 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project postion-report-service: Fatal error compiling 解决方法 pom.xml 中java.version配置为11 检查Maven中的jre是否配置正确

1.下载安装ESP32开发环境ESP-IDE

ESP32简介 ESP32介绍 说到ESP32&#xff0c;首先ESP32不是一个芯片&#xff0c;ESP32是一个系列芯片&#xff0c; 是乐鑫自主研发的一系列芯片微控制器。它主要的功能就是支持WiFi和蓝牙&#xff0c; ESP32指的是ESP32裸芯片。但是&#xff0c;“ESP32”一词通常指ESP32系列芯…

11.用AI运行AI

文章目录 Godmode使用示例概念Recursive Reprompting and Revision(Re3)Language Models as Zero-Shot PlannersHuggingGPTLanguage models can solve computer tasks 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索。 用AI运行AI&#xff0c;顾…

PBKDF2算法:保障密码安全的利器

title: PBKDF2算法&#xff1a;保障密码安全的利器 date: 2024/3/14 16:40:05 updated: 2024/3/14 16:40:05 tags: PBKDF2算法密码安全性迭代盐值密钥 PBKDF2算法起源&#xff1a; PBKDF2&#xff08;Password-Based Key Derivation Function 2&#xff09;算法是一种基于密码…

【计算机网络实践】FileZilla Server1.8.1实现局域网ftp文件传输

大二新生随便写写笔记&#xff0c;轻喷&#xff0c;鉴于本人在网络搜索中并未搜索到1.8.1版本的使用方法&#xff0c;因而瞎写一页。 一、准备 下载一个FileZilla Server1.8.1在你想作为服务器的主机上&#xff08;此处直接在官网下载即可&#xff1a;Download FileZilla Serve…

Apache如何配置https以及80重定向443(一文搞懂)

最近公司项目考虑到安全性要使用https&#xff0c;于是领导就把这个任务交给了我&#xff0c;今天就一次性搞懂https如何配置。 文章目录 一、HTTP和HTTPS概念二、HTTP和HTTPS区别三、Apache安装1. 通过ssh连接到我们的服务器2. 使用yum安装apache 四、配置证书1. 安装ssl证书模…

Docker自建一款开源,实用,多功能的网络工具箱

项目地址 https://github.com/jason5ng32/MyIP 项目介绍 查询IP&#xff0c;出口IP&#xff0c;IP信息 测试地址&#xff1a;https://ipcheck.ing/ 功能特点 &#x1f5a5;️ 看自己的 IP&#xff1a;从多个 IPv4 和 IPv6 来源检测显示本机的 IP &#x1f575;️ 看 IP …

设计模式之中介者模式

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.使用 5.总结 1.概述 我们编写的大部分代码都有不同的组件(类)&#xff0c;它们通过直接引用或指针相互通信。但是在某些情况下&#xff0c;我们不希望对象知道彼此的存在。有时&#xff…

【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、虚函数与重写1.1 虚函数1.2 虚函数的重写1.3 重写的特例1.4 final和override&#xff08;C11&#xff09;1.…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

Linux网络基础2之http

这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 目录 一、认识URL 1.认识URL 2.urlencode和urldecode 二、HTTP协议格式 1.快速构建http请求和相应的报文格式 三、http demo 1.GET和POST 2.HTTP的状态码 3.http的特征 4.HTTP常见Head…

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial&#xff08;网格 Lambert 材质&#xff09; 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面&#xff0c;该材质非常易用&#xff0c;而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

STM32/GD32——电源管理单元PWU

芯片选型 Ciga Device — GD32F470系列 PWU介绍 PMU全称Power Management Unit&#xff0c;电源管理单元。 电源域 总共有三大电源域&#xff0c;包括VDD / VDDA域&#xff0c;1.2V域和备份域。 VDD/VDDA 域 提供PMU 常规电源供应以下模块的供电&#xff1a; 看门狗主频晶…

ASP.NET Core Web API 流式返回,逐字显示

Websocket、SSE&#xff08;Server-Sent Events&#xff09;和长轮询&#xff08;Long Polling&#xff09;都是用于网页和服务端通信的技术。 Websocket是一种全双工通信协议&#xff0c;能够实现客户端和服务端之间的实时通信。它基于TCP协议&#xff0c;并且允许服务器主动向…