当前位置: 移动技术网 > IT编程>开发语言>Java > java图形界面编程之模拟血压计

java图形界面编程之模拟血压计

2019年07月22日  | 移动技术网IT编程  | 我要评论

郑宝用,mydhc,热火vs步行者第5场

复制代码 代码如下:

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 樊俊彬
 * @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.black);
   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();
 }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网