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

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.rhkb.cn/news/275637.html

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

相关文章

UDP数据报套接字编程

1.1UDP编程原理 对于UDP协议来说&#xff0c;具有无连接&#xff0c;面向数据报的特征&#xff0c;即每次都是没有建立连接&#xff0c;并且一次发送全部数据报&#xff0c;一次接收全部的数据报。Java中使用UDP协议通信&#xff0c;主要基于DatagramSocket类来发送或接收数据报…

NBlog整合OSS图库

NBlog部署维护流程记录&#xff08;持续更新&#xff09;&#xff1a;https://blog.csdn.net/qq_43349112/article/details/136129806 由于项目是fork的&#xff0c;所以我本身并不清楚哪里使用了图床&#xff0c;因此下面就是我熟悉项目期间边做边调整的。 目前已经调整的功能…

Docker容器Docker桌面配置镜像加速

打开Docker Desktop应用程序&#xff0c;点击设置 具体配置如下&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buil…

个人博客系列-后端项目-用户注册功能(7)

介绍 用户注册API的主要流程&#xff1a;1.前端用户提交用户名&#xff0c;密码 2. 序列化器校验用户名&#xff0c;密码是否合法。3.存入数据库。4.签发token 创建序列化器 from rest_framework import serializers from rest_framework_simplejwt.serializers import Toke…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist&#xff0c;在electron-builder签名打包时&#xff0c;给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证&#xff0c;若出现这个&#xff0c;则说明成…

[BJDCTF2020]Cookie is so stable

hint提示查看cookies flag.php页面我们先随便输入一个名字 输入后我们重新进一次flag.php&#xff0c;发现cookie里存储了刚刚登陆时输入的用户名&#xff0c;直接猜是ssti 尝试后根据ssti特征判断是twig模板 {{_self.env.registerUndefinedFilterCallback("exec")…

VUE实现Provide的计算属性

通过此篇可以学到&#xff1a; 如何使用Providerinject进行“跨代”传值如何实现一个计算属性的Provider如何解决告警“injection "xxxxx" not found. ” 一、描述 目前需要创建一个计算属性传入Provide&#xff0c;并且能够被其他组件Inject 二、实现 父组件 .…

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

Tomcat多实例及nginx反向代理tomcat

tomcat多实例介绍&#xff1a; 什么是Tomcat多实例&#xff1f; Tomcat多实例就是指在同一台服务器上运行多个独立的tomcat实例&#xff0c;每个实例之间都是相互隔离的。每个tomcat实例都具有独立的配置文件、日志文件、应用程序和端口。通过配置不同的端口和文件目录&#xf…

如何有效避免团队内耗,提升团队整体效能

团队内耗是一个普遍存在的问题&#xff0c;它可能导致工作效率低下、沟通不畅、成员间的信任缺失&#xff0c;甚至可能导致整个团队的崩溃。 它可能源于成员间的误解、利益冲突&#xff0c;或是个人情绪的波动。 如何避免团队内耗&#xff0c;是每个团队管理者和成员都应该关…

骏聪科技:以科技之力赋能企业 打造数字时代安全基石

在当今数字化时代,信息安全和技术信息化已经成为了现代社会的一个重要议题。随着科技的迅猛发展,信息技术的普及,以及网络互联的普遍性,安全技术信息化行业也蓬勃发展。这个领域的增长不仅改变了我们的日常生活,也对各行各业产生了深远的影响。在这个发展浪潮中,苏骏聪信息科技…

景联文科技:提供行业垂直大模型训练数据

近年来&#xff0c;以大模型为代表的人工智能技术已成为国家科技实力竞争的焦点。其中垂直大模型作为重要方向&#xff0c;在相关政策引导及市场需求的驱动下&#xff0c;已展现出较强的发展活力。 行业垂直大模型是针对特定行业的需求和场景进行深度定制的。这意味着模型在训练…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

(黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_01&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——保护 今日目标1.初识Sentinel1.1.雪崩问题及解决方案1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.…

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…

`httpsok`:轻松搞定免费的泛域名SSL/TLS证书

&#x1f525;&#x1f525;&#x1f525; httpsok&#xff1a;轻松搞定免费的泛域名SSL/TLS证书 在当今互联网时代&#xff0c;网站的安全性已成为一项不可或缺的重要因素。其中&#xff0c;采用HTTPS协议是一种有效的保护措施&#xff0c;但对于个人和团队开发者来说&#x…

Ubuntu23.10安装FFmpeg及编译FFmpeg源码

安装FFmpeg: 打开终端: 输入 sudo apt install ffmpeg 安装成功: 验证FFmpeg 默认安装位置与库与头文件位置 使用FFmpeg源码编译: 1.安装YASM sudo apt-get install yasm

2024年腾讯云便宜学生云服务器购买攻略

腾讯云学生服务器优惠活动「云校园」轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置112元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G3M公网带宽配置842.4元一年&#xff0c;腾讯云服务器网txyfwq.com分享2…

数据库管理-第160期 Oracle Vector DB AI-11(20240312)

数据库管理160期 2024-03-12 数据库管理-第160期 Oracle Vector DB & AI-11&#xff08;20240312&#xff09;1 向量的函数操作to_vector()将vector转换为标准值vector_norm()vector_dimension_count()vector_dimension_format() 2 将向量转换为字符串或CLOBvector_seriali…