java实现模拟进度计量器

本文实例为大家分享了java模拟进度计量器的具体代码,供大家参考,具体内容如下

一、程序说明

1、自定义模拟血压计外观图class MyCanvas 继承 Canvas类,重写其中的public void paint(Graphics g)方法,里边绘制详细的界面组件外观,包括边框、玻璃外壳、高压水银柱、低压高压水银柱、底部水银圆球、左右侧0刻度线、刻度线等。

2、主框架类Blood 继承 JFrame,设定布局,添加文本框和输入框用于为高、低压赋值。实例化MyCanvas类产生对象bloodCanvas,并将bloodCanvas添加到框架中央区。

3、高压、低压计时器highPressTimer, lowPressTimer用于每隔一定的时间去执行特定任务,高压与低压更新任务highPressTaskPerformer,lowPressTaskPerformer用于完成进度条更新。

4、程序中的重点:

(1)、绘制动态高压、低压进度条,其中低压水银柱计时器嵌套于高压计时器内部,有先后顺序,高压先上升,后低压下降。

(2)、绘制刻度线算法。

二、运行效果

三、源代码

package GraphicsCanvas;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;

/**
 * 模拟血压计类,高压、低压
 *
 * @author Freedoman
 * @Time 2013-12-10
 */
public class Blood extends JFrame {

 private static final long serialVersionUID = 1L;
 private Image iBuffer;
 private MyCanvas bloodCanvas = new MyCanvas();
 private JTextField highPressText, lowPressText;

 // 画布长宽
 private final int CANVAS_WIDTH = 400;
 private final int CANVAS_HEIGHT = 800;

 // 玻璃外壳长宽与起始坐标
 private final int BLOOD_WIDTH = 30;
 private final int BLOOD_HEIGHT = 650;
 private final int BLOOD_X = CANVAS_WIDTH / 2 - BLOOD_WIDTH / 2;
 private final int BLOOD_Y = 50;

 // 框架大小与起始坐标
 private final int FRAME_WIDTH = 120;
 private final int FRAME_HEIGHT = 720;
 private final int FRAME_X = CANVAS_WIDTH / 2 - FRAME_WIDTH / 2;
 private final int FRAME_Y = BLOOD_Y - 20;

 // 0刻度线的横纵坐标与长度
 private final int ZORELINE_Y = BLOOD_Y + BLOOD_HEIGHT - 10;
 private final int ZORELINE_X = CANVAS_WIDTH / 2 + BLOOD_WIDTH / 2;
 private final int LINE_LENGTH = 8;

 // 输入的高压、低压
 private int highPressInput, lowPressInput;

 // 高、低压水银柱的动态高度
 int highPressHeight = 0;
 int lowPressHeight = 0;
 int startLow = BLOOD_Y;

 // 高、低水银计时器
 Timer highPressTimer, lowPressTimer;

 public Blood() {

 super("自定义血压计模型-FreeDoman");
 this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 this.setBounds(300, 50, CANVAS_WIDTH, CANVAS_HEIGHT + 20);

 // 添加控制到框架北部区
 JPanel topPanel = new JPanel();
 this.add(topPanel, BorderLayout.NORTH);
 highPressText = new JTextField(5);
 lowPressText = new JTextField(5);

 JButton pressButton = new JButton("显示");
 pressButton.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent arg0) {
  highPressInput = Integer.parseInt(highPressText.getText());
  lowPressInput = Integer.parseInt(lowPressText.getText());

  ActionListener highPressTaskPerformer = new ActionListener() {
   public void actionPerformed(ActionEvent evt) {
   // 高度增加 1像素/0.01s,只到满足输入的要求,停止计时
   highPressHeight += 1;
   bloodCanvas.repaint();
   if (highPressHeight == highPressInput * 2) {
    highPressTimer.stop();

    // 低压水银柱计时器嵌套于高压计时器内部,有先后顺序(高压先走,后低压)
    startLow = ZORELINE_Y - highPressHeight;
    ActionListener lowPressTaskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
     lowPressHeight += 1;
     bloodCanvas.repaint();
     if (lowPressHeight == ZORELINE_Y
      - lowPressInput * 2 - startLow)
     lowPressTimer.stop();
    }
    };
    lowPressTimer = new Timer(10, lowPressTaskPerformer);
    lowPressTimer.start();
   }
   }
  };
  // 定义每0.01秒执行一次的事件监听器
  highPressTimer = new Timer(10, highPressTaskPerformer);
  highPressTimer.start();
  }
 });

 topPanel.add(new JLabel("高压值", JLabel.CENTER));
 topPanel.add(highPressText);
 topPanel.add(new JLabel("低压值", JLabel.CENTER));
 topPanel.add(lowPressText);
 // topPanel.add(new JLabel("心率", JLabel.CENTER));
 topPanel.add(pressButton);
 // 添加画布到中央区
 this.add(bloodCanvas, BorderLayout.CENTER);
 this.setResizable(false);
 this.setVisible(true);
 }

 /**
 * 画布重绘血压计
 */
 class MyCanvas extends Canvas {
 public void paint(Graphics g) {

  // 画边框
  g.setColor(Color.BLUE);
  g.draw3DRect(FRAME_X, FRAME_Y, FRAME_WIDTH, FRAME_HEIGHT, true);

  // 画玻璃外壳
  g.setColor(Color.ORANGE);
  g.fill3DRect(BLOOD_X, BLOOD_Y, BLOOD_WIDTH, BLOOD_HEIGHT, true);

  // 高压水银柱
  g.setColor(Color.RED);
  g.fill3DRect(BLOOD_X, ZORELINE_Y - highPressHeight, BLOOD_WIDTH,
   highPressHeight, true);

  // 低压高压水银柱
  g.setColor(Color.ORANGE);
  g.fill3DRect(BLOOD_X, startLow, BLOOD_WIDTH, lowPressHeight, true);

  // 画底部水银圆球
  g.setColor(Color.RED);
  g.fillOval(CANVAS_WIDTH / 2 - 30, ZORELINE_Y - 5, 60, 60);

  // 右侧0刻度线起始刻度与坐标(刻度线纵坐标以line_y渐变)
  int rightStartDegree = 0;

  int line_y = ZORELINE_Y;
  for (; line_y > BLOOD_Y; line_y -= 2) {

  // 2个像素点为一个最小分度 1度
  g.setColor(Color.BLACK);
  g.drawLine(ZORELINE_X, line_y, ZORELINE_X + LINE_LENGTH, line_y);

  // 每隔10最小分度个画10度刻度线
  if (line_y % 20 == 10) {
   g.setColor(Color.BLUE);
   g.drawLine(ZORELINE_X, line_y,
    ZORELINE_X + LINE_LENGTH * 2, line_y);
   g.drawString(rightStartDegree + "", ZORELINE_X
    + LINE_LENGTH * 3, line_y + 4);
   rightStartDegree += 10;
  }
  }

  // 左侧0刻度线起始刻度与坐标(刻度线纵坐标以line_y渐变)
  int leftStartDegree = 0;
  int leftLine_y = ZORELINE_Y;
  for (; leftLine_y > BLOOD_Y; leftLine_y -= 6) {

  // 6个像素点为一个最小分度 1度
  g.setColor(Color.BLACK);
  g.drawLine(BLOOD_X, leftLine_y, BLOOD_X - LINE_LENGTH,
   leftLine_y);

  // 每隔10最小分度个画10度刻度线
  if (leftLine_y % 20 == 10) {
   g.setColor(Color.BLUE);
   g.drawLine(BLOOD_X, leftLine_y, BLOOD_X - LINE_LENGTH * 2,
    leftLine_y);
   g.drawString(leftStartDegree + "", BLOOD_X - LINE_LENGTH
    * 4, leftLine_y + 4);
   leftStartDegree += 10;
  }
  }
 }

 /**
  * 双缓冲技术:复杂的计算速度慢于屏幕显示,用缓冲解决屏幕闪烁问题
  */

 @Override
 public void update(Graphics g) {
  if (iBuffer == null) {
  iBuffer = createImage(this.getSize().width,
   this.getSize().height);

  }
  Graphics gBuffer = iBuffer.getGraphics();
  gBuffer.setColor(getBackground());
  gBuffer.fillRect(0, 0, this.getSize().width, this.getSize().height);
  paint(gBuffer);
  gBuffer.dispose();
  g.drawImage(iBuffer, 0, 0, this);
 }
 }

 public static void main(String[] args) {

 // 设置界面的外观,为系统外观
 try {
  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 } catch (Exception e) {
  e.printStackTrace();
 }

 new Blood();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java动态显示文件上传进度实现代码

    实现文件上传的进度显示,我们先看看都有哪些问题我们要解决. 1 上传数据的处理进度跟踪 2 进度数据在用户页面的显示 就这么2个问题, 第一个问题,主要是组件的选择 必须支持数据处理侦听或通知的组件.当然,我肯定只用我自己的组件啦.基本原理是 1 使用request.getContentLength() 读取到处理数据的总长度,注意这个长度不等于文件的长度,因为Base64等编码会增加数据量,如果超过了允许的长度,直接返回-1; 2 在每读取一部分数据时(比如一行,或者64K,或者你自定义的字节

  • java读取文件显示进度条的实现方法

    实现这个功能比较简单,用到的类有两个:ProgressMonitorInputStream(主要是整个类) 和 ProgressMonitor ,它们在javax.swing中大体思路,你要首先知道整个文件的大小,和当前已经读取文件的大小,获得整个文件大小的方法 复制代码 代码如下: ProgressMonitorInputStream monitor;/*** @param 表示此进度条要依附在哪个组件上* @param 显示在此进度条上的消息* @param 需要监控的输入流*/monito

  • java控制台输出百分比进度条示例

    System.out.print("\b") 会在控制台下往回删掉一个字符,如果你想回删多个字符就打印多个 "\b" 复制代码 代码如下: public static void main(String[] args) throws Exception {    System.out.print("Progress:");    for (int i = 1; i <= 100; i++) {        System.out.print(

  • Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以实现实时更新已上传文件的大小,有了这个还说什么呢? 这里给出代码: package lc.progress; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import lc.

  • JavaWeb项目实现文件上传动态显示进度实例

    很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之后网页就跳转了.后来我学习到了Ajax,我知道了浏览器可以异步的发送响应,这时我又有新的疑问,那就是在我上传一些文件的时候,那些网站的上传进度是怎么做到的,因为servlet直到上传完成之后才完成响应. 最近我们的项目中有一个地方中需要用到一个功能,当用户点击一个处理按钮时,前台会实时的显示后台处理

  • Java Swing JProgressBar进度条的实现示例

    1. 概述 官方JavaDocsApi: javax.swing.JProgressBar JProgressBar,进度条. 以可视化形式显示某些任务进度的组件. 进度条中心可显示进度百分比的文本表示形式. 当一个任务的进度长度未知时,可将进度条设置为不确定模式.不确定模式的进度条持续地显示动画来表示正进行的操作.当 可以确定任务长度和进度量时,则可设置进度条的最大最小值,以及更新进度条的进度值,将其切换回确定模式. JProgressBar 常用构造方法: /** * 构造方法中的参数含义:

  • java实现在复制文件时使用进度条(java实现进度条)

    思路分析: 因为既要有操作面板又要有进度条,所以肯定要出现两个继承JFrame类的窗体.先看被调用的进度条窗体,它不需要手动操作,所以类的内部实现一个方法就可以了.因为设计文件操作,所以要捕获异常.首先根据要复制的文件创建File对象,以及根据复制后文件的保存地址创建File对象,然后创建FileOutputStream对象,再创建FileInputStream对象,之后是ProgressMonitorInputStream对象,然后读取文件,如果总耗时超过2秒,将会自动弹出一个进度监视窗口.接

  • Java Swing组件实现进度监视功能示例

    本文实例讲述了Java Swing组件实现进度监视功能.分享给大家供大家参考,具体如下: 实例一: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ProgressMonitor; import javax.swing.Timer; public class TestProgressMonitor { Timer timer; public void init(

  • 基于Retrofit+Rxjava实现带进度显示的下载文件

    本文实例为大家分享了Retrofit Rxjava实现下载文件的具体代码,供大家参考,具体内容如下 本文采用 :retrofit + rxjava 1.引入: //rxJava compile 'io.reactivex:rxjava:latest.release' compile 'io.reactivex:rxandroid:latest.release' //network - squareup compile 'com.squareup.retrofit2:retrofit:latest

  • java实现模拟进度计量器

    本文实例为大家分享了java模拟进度计量器的具体代码,供大家参考,具体内容如下 一.程序说明 1.自定义模拟血压计外观图class MyCanvas 继承 Canvas类,重写其中的public void paint(Graphics g)方法,里边绘制详细的界面组件外观,包括边框.玻璃外壳.高压水银柱.低压高压水银柱.底部水银圆球.左右侧0刻度线.刻度线等. 2.主框架类Blood 继承 JFrame,设定布局,添加文本框和输入框用于为高.低压赋值.实例化MyCanvas类产生对象bloodC

  • Android ProgressBar 模拟进度条效果的实现

    进度条的使用 圆形进度条 <ProgressBar android:id="@+id/pb" android:layout_width="50dp" android:layout_height="50dp" /> 如图 长条不显示进度进度条 <ProgressBar android:id="@+id/pb2" android:layout_width="300dp" android:lay

  • java通过模拟post方式提交表单实现图片上传功能实例

    本文实例讲述了java通过模拟post方式提交表单实现图片上传功能.分享给大家供大家参考,具体如下: 模拟表单html如下: <form action="up_result.jsp" method="post" enctype="multipart/form-data" name="form1" id="form1"> <label> <input type="tex

  • Java数组模拟优先级队列数据结构的实例

    优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先

  • java 中模拟UDP传输的发送端和接收端实例详解

    java 中模拟UDP传输的发送端和接收端实例详解 一.创建UDP传输的发送端 1.建立UDP的Socket服务: 2.将要发送的数据封装到数据包中: 3.通过UDP的Socket服务将数据包发送出去: 4.关闭Socket服务. import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class

  • jquery模拟进度条实现方法

    本文实例讲述了jquery模拟进度条实现方法.分享给大家供大家参考.具体如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>js模拟进度条练习</title> <script type='text/javascript' src="http://xiazai.jb51.net/201508/yuanma/jquery-1.8

  • layui扩展上传组件模拟进度条的方法

    如下所示: <div id="uploadPatchForm" style="display:none" class="roundRect"> <div id="uploadLoadingDiv"> <div class="layui-progress" lay-showpercent="true" lay-filter="demo" &

  • Ajax+PHP实现的模拟进度条功能示例

    本文实例讲述了Ajax+PHP实现的模拟进度条功能.分享给大家供大家参考,具体如下: 一 代码 fun.js: function progress(){ setInterval("beginProgress()", 200); } function beginProgress(){ $.get("progress.php", null, function(data){ $("#pg").css("width", data+&q

  • 使用Java程序模拟实现新冠病毒传染效果

    简单介绍 2020年注定是不平凡的一年,新冠肺炎肆虐全球,传染性特别强,目前全球感人人数还在逐渐攀升,作为中华儿女特别感谢政府作出的努力,非常感谢并致敬医护人员,是他们的努力为我们创造安全的环境,向你们致敬! 模拟方案 以下是程序粗略的模拟病毒传染过程,具体方案如下: 首先需要构造一个200 * 200的格子界面有四种不同的颜色状态标记着程序执行的过程程序执行10次,初始化格子也就是0的时候,需要在整个格子最中心的100个格子标记为红色,剩余数据随机抽取四千(且不能重复)标记为黑色,其余没有标记

  • Java多线程、进度条实现赛马实验的示例代码

    赛马 下周一就要去做java实验了,还记得上一次实验还有一个程序没写完,匆匆交了实验报告的半成品(希望老师没发现www).为了下周一能有更充裕的时间在实验课写代码,我搜了一下我们学校的实验报告.嘿,宁猜怎么着!还真有16年的实验报告.虽然有点不太一样,但题目大多是相同的,于是我就开始写. 这是有关赛马的一个程序,题目如下:编写一个多线程的控制程序,称为赛马程序.创建分别代表两匹马的两个线程,并将它们设置为高低不同的优先级,并以进度条的形式显示赛马过程. 以下是我经过多方学习写出的代码,希望大佬斧

随机推荐