效果如下

代码如下(初始版本)

package cn.com.com;import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;import javax.swing.JFrame;
import javax.swing.JPanel;public class Test extends JPanel {// 动态的绘图public static void main(String[] args) {// 0.设置窗体的内容JFrame jf = new JFrame("JAVA动态图形");// 1.设置一下窗体的宽高情况jf.setSize(500, 500);// 获取面板的内容jf.getContentPane().add(new Test());// 2.设置关闭窗体就是关闭线程jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 3.设置可见jf.setVisible(true);}/** 集合 最大的容纳量 值*/private static List<Integer> list;private static int size = 60;private static int value = 100;// 2.一个动态的集合public Test() {list = Collections.synchronizedList(new ArrayList<Integer>());new Thread(new Runnable() {public void run() {// TODO Auto-generated method stubwhile (true) {// 2.1首先判断能不能添加,如果不能首先移除if (list.size() > size) {list.remove(0);// 移除第一个数据}// 2.1.1 产生一个随机数Random r = new Random();// 2.1.2 把数放在集合里面System.out.println(r.nextInt(100));list.add(r.nextInt(100));// 2.2绘制的开始设置x,y/** 在绘制动画图形时候如果没有调用repaint()方法的时候直接就是由线程调用* 这个需要线程,不然没有效果*/repaint();// 2.3延迟0.1s,不然的话页面绘制图片会显得有突兀try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}// 3 绘制一下@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);// 准备绘制Graphics2D g2d = (Graphics2D) g;// 设置绘制线条的质量g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);// 设置宽高// 设置宽高int x = getHeight() / size;int y = getWidth() / value;int len = list.size();// 开始循环遍历数据for (int i = 0; i < len - 1; i++) {g2d.drawLine(x * (size - len + i), y * list.get(i), x* (size - len + i + 1), y * list.get(i + 1));}}}

代码如下(规范版本)

package cn.com.com;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/*author:命运的信徒* date:2019.7.18* arm:java动态绘图的方法*/
public class Plaint extends JPanel {private List<Integer> values;                      // 存储数据的集合,线程不安全private static final int MAX_VALUE = 200;          // 最大值(限制里面的y数据)private static final int MAX_COUNT_OF_VALUES = 50; // 集合的最大容量public Plaint() {//一个线程安全的集合values = Collections.synchronizedList(new ArrayList<Integer>());// 使用线程的目的,动态的,可以往集合里面添加和去除数据new Thread(new Runnable() {public void run() {//一个随机数,准确的说是小于200的Random rand = new Random();try {while (true) {//生成的数添加集合,如果集合里面的数据多了就剔除数据addValue(rand.nextInt(MAX_VALUE)); // 产生一个数据,并模拟接收并放到容器里.System.out.println("线程");//这个是一个重绘的方法,是线程安全的;可以调用paintComponent(Graphics g) 方法repaint();Thread.sleep(100);}} catch (InterruptedException e) {e.printStackTrace();}}}).start();}@Overridepublic void paintComponent(Graphics g) {super.paintComponent(g);
//准备绘制Graphics2D g2d = (Graphics2D) g;
//设置绘制线条的质量g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//设置宽高int w = getWidth();int h = getHeight();
//设置x轴方向的单位长度;如果宽400px,设置最大的数据容量是50;那么一个数据就占据8pxint xDelta = w / MAX_COUNT_OF_VALUES;
//这个是集合的实时长度,肯定是小于或等于MAX_COUNT_OF_VALUESint length = values.size();
//对集合里面的数据进行绘制,第一个点和第二个点要连线for (int i = 0; i < length - 1; ++i) {/** x轴的位置:xDelta * (MAX_COUNT_OF_VALUES - length + i)  如果集合的数据没有溢出来,一定是最后一个是最右边,第一个是集合的最大长度-集合当前长度+1;* y轴的位置:normalizeValueForYAxis(values.get(i), h)* 前一个数据和后一个数据相连接*/g2d.drawLine(xDelta * (MAX_COUNT_OF_VALUES - length + i), normalizeValueForYAxis(values.get(i), h),xDelta * (MAX_COUNT_OF_VALUES - length + i + 1), normalizeValueForYAxis(values.get(i + 1), h));}}/*** 接收到的数据放入内存.* @param value*/private void addValue(int value) {// 循环的使用一个接收数据的空间.// 最好是实现一个循环数组,而不是偷懒的使用ArrayList.if (values.size() > MAX_COUNT_OF_VALUES) {values.remove(0);}values.add(value);}/*** 规一化y轴方向的值. 使得value在y轴的值为[0, height]之间.*/private int normalizeValueForYAxis(int value, int height) {return (int) ((double) height / MAX_VALUE * value);}private static void createGuiAndShow() {//窗体的名称JFrame frame = new JFrame("java动态绘制图形");//内容frame.getContentPane().add(new Plaint());//设置关闭窗体就是关闭整个程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体的大小frame.setSize(600, 600);frame.setLocationRelativeTo(null);//设置窗体可见frame.setVisible(true);}public static void main(String[] args) {createGuiAndShow();}
}

java 绘制动态的图形相关推荐

  1. java 绘制动态小球_JavaScript动画实例:动感小球

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...

  2. python绘制动态变化的图_用Jupyter Noteb中的matplotlib绘制动态变化图形

    我一直在寻找一个很好的解决方案,其中一个线程正在泵送数据,我们希望Jupyter笔记本不断更新图形,而不阻止任何事情.在查阅了十几个相关答案后,以下是一些发现: 小心 如果你想要一个实时的图表,不要使 ...

  3. java绘制图形_java绘制基本图形.doc

    java绘制基本图形 java绘制基本图形 1. * *** ***** 2. * * * ***** 3. ************* * * * * ************* 4. ****** ...

  4. Java绘制图形(正方形/三角形/圆/网以及填充颜色)

    Java绘制图形(正方形/三角形/圆/网以及填充颜色) 首先用EasyGraphics确定图片大小 然后用setcolor来设置图象主题颜色 也可以给特定大的点设置颜色 例如: g.setColor( ...

  5. P5.JS绘制动态图形

    P5.JS绘制动态图形 一.平台 第一次使用p5.js进行码绘,此次直接使用P5.JS官网的在线编辑器进行编写,完成后点击file->download即可保存到本地. 在正式绘制之前,我经过小小 ...

  6. Python绘制动态图形

    Python绘制动态图形 一.柱形图 二.气泡图 三.折线图 四.小提琴图 五.面积图 六.漏斗图 七.带状图 日常生活中,我们经常需要对多年的数据进行分析.如果对每一年的数据都进行可视化,那么将需要 ...

  7. java绘图技术,演示绘制不同的图形

    java绘图技术,演示绘制不同的图形. 做一个笔记,方便日后查找. import javax.swing.*; import java.awt.*;public class DrawCircle ex ...

  8. Android studio中实现CANVAS(用JAVA绘制各种图形以及渐变动画)

    方法一:直接在JAVA类中写图形定义(4个参数均为坐标,指的是以上边界和左边界为原点的坐标,即边界距离) public class DrawView extends View {public Draw ...

  9. 如何使用Matlab绘制动态曲线,并生成gif图形

    文章目录 0. 原由 1. 思路 2. 函数 3. 演示 3.1 动态绘制圆 3.2 绘制动态正弦曲线 3.3 绘制不同阻尼比二阶系统的动态阶跃响应曲线 3.4 绘制旋转的五角星曲线 推荐 联系作者 ...

最新文章

  1. mysql数据库连接javaweb_javaweb中mysql数据库连接方法
  2. 真正聪明的人,为什么从不去社交?
  3. python如何显示时间_如何让python显示当前时间(东部)
  4. int mysql_「MYSQL」MYSQL中的int(11)到底代表什么意思?
  5. flutter实现Icon可以用Image替换
  6. 视频教程-交换技术(CCNA魔鬼训练营系列)-思科认证
  7. 【3ds Max】 - 如何使用分布式渲染?
  8. 最难忘的一节计算机课,最难忘的一节课作文(3篇)
  9. “看得见的手”:浅谈我国网约车监管
  10. 数图互通高校房产管理——房屋模拟分配建设
  11. 2020-2021下学期 奖状的清单
  12. Linux 系统编程笔记-(1)基本概念
  13. [树状数组] 洛谷P3374
  14. 机器人能送药、治病、消毒,最大程度保护医生护士不被传染!
  15. Mac安装Sass介绍
  16. GPU芯片海飞科联合创始人兼总裁姚飞到访极客天成ScaleFlash
  17. 深圳Java学习:小白速懂Https协议
  18. minecraft启动器_如何使用外部编辑器编辑Minecraft地图
  19. RFID技术应用于城市垃圾管理系统
  20. MQTT Version 3.1.1——OASIS Standard

热门文章

  1. C#中判断空字符串的3种方法性能分析 1
  2. 手机变蓝牙音响_能提升幸福感的几大3C数码配件推荐?有线变无线、居家办公神器...
  3. 前端开发新人写简历的大概套路
  4. Windows下,文件(夹)选择/打开对话框的三种创建方式
  5. UOJ 【UR #4】追击圣诞老人 题解
  6. 游戏建模:手绘暗黑小萝莉
  7. Python安装Pyecharts和Jupyter Notebook,与使用
  8. 直击产业落地 | 飞桨重磅推出业界首个模型选型工具
  9. 无服务器永久网站,ZeroNet无需域名服务器建立永久不会被拦截的网站
  10. 1、SONIX单片机新建工程与烧录流程