mev-4.0.01/source/org/tigr/util/swing/MemoryMonitor.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: MemoryMonitor.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.4 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 21:00:04 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 package org.tigr.util.swing;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import java.awt.BorderLayout;
2 26 Feb 07 jari 16 import java.awt.Color;
2 26 Feb 07 jari 17 import java.awt.Dimension;
2 26 Feb 07 jari 18 import java.awt.Font;
2 26 Feb 07 jari 19 import java.awt.FontMetrics;
2 26 Feb 07 jari 20 import java.awt.Graphics;
2 26 Feb 07 jari 21 import java.awt.Graphics2D;
2 26 Feb 07 jari 22 import java.awt.Rectangle;
2 26 Feb 07 jari 23 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 24 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 25 import java.awt.event.WindowAdapter;
2 26 Feb 07 jari 26 import java.awt.event.WindowEvent;
2 26 Feb 07 jari 27 import java.awt.event.WindowListener;
2 26 Feb 07 jari 28 import java.awt.geom.Line2D;
2 26 Feb 07 jari 29 import java.awt.geom.Rectangle2D;
2 26 Feb 07 jari 30 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 31 import java.util.Date;
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 import javax.swing.JCheckBox;
2 26 Feb 07 jari 34 import javax.swing.JFrame;
2 26 Feb 07 jari 35 import javax.swing.JLabel;
2 26 Feb 07 jari 36 import javax.swing.JPanel;
2 26 Feb 07 jari 37 import javax.swing.JTextField;
2 26 Feb 07 jari 38 import javax.swing.border.EtchedBorder;
2 26 Feb 07 jari 39 import javax.swing.border.TitledBorder;
2 26 Feb 07 jari 40
2 26 Feb 07 jari 41
2 26 Feb 07 jari 42 /**
2 26 Feb 07 jari 43  * Tracks Memory allocated & used, displayed in graph form.
2 26 Feb 07 jari 44  */
2 26 Feb 07 jari 45 public class MemoryMonitor extends JPanel {
2 26 Feb 07 jari 46     
2 26 Feb 07 jari 47     static JCheckBox dateStampCB = new JCheckBox("Output Date Stamp");
2 26 Feb 07 jari 48     public Surface surf;
2 26 Feb 07 jari 49     JPanel controls;
2 26 Feb 07 jari 50     boolean doControls;
2 26 Feb 07 jari 51     JTextField tf;
2 26 Feb 07 jari 52     
2 26 Feb 07 jari 53     public MemoryMonitor() {
2 26 Feb 07 jari 54   setLayout(new BorderLayout());
2 26 Feb 07 jari 55   setBorder(new TitledBorder(new EtchedBorder(), "Memory Monitor"));
2 26 Feb 07 jari 56   add(surf = new Surface());
2 26 Feb 07 jari 57   controls = new JPanel();
2 26 Feb 07 jari 58   controls.setPreferredSize(new Dimension(135,80));
2 26 Feb 07 jari 59   Font font = new Font("serif", Font.PLAIN, 10);
2 26 Feb 07 jari 60   JLabel label = new JLabel("Sample Rate");
2 26 Feb 07 jari 61   label.setFont(font);
2 26 Feb 07 jari 62   label.setForeground(Color.black);
2 26 Feb 07 jari 63   controls.add(label);
2 26 Feb 07 jari 64   tf = new JTextField("1000");
2 26 Feb 07 jari 65   tf.setPreferredSize(new Dimension(45,20));
2 26 Feb 07 jari 66   controls.add(tf);
2 26 Feb 07 jari 67   controls.add(label = new JLabel("ms"));
2 26 Feb 07 jari 68   label.setFont(font);
2 26 Feb 07 jari 69   label.setForeground(Color.black);
2 26 Feb 07 jari 70   controls.add(dateStampCB);
2 26 Feb 07 jari 71   dateStampCB.setFont(font);
2 26 Feb 07 jari 72   addMouseListener(new MouseAdapter() {
2 26 Feb 07 jari 73       public void mouseClicked(MouseEvent e) {
2 26 Feb 07 jari 74     removeAll();
2 26 Feb 07 jari 75     if ((doControls = !doControls)) {
2 26 Feb 07 jari 76         //                   surf.stop();
2 26 Feb 07 jari 77         add(controls);
2 26 Feb 07 jari 78     } else {
2 26 Feb 07 jari 79         try {
2 26 Feb 07 jari 80       surf.sleepAmount = Long.parseLong(tf.getText().trim());
2 26 Feb 07 jari 81         } catch (Exception ex) {
2 26 Feb 07 jari 82         }
2 26 Feb 07 jari 83         surf.start();
2 26 Feb 07 jari 84         add(surf);
2 26 Feb 07 jari 85     }
2 26 Feb 07 jari 86     validate();
2 26 Feb 07 jari 87     repaint();
2 26 Feb 07 jari 88       }
2 26 Feb 07 jari 89   });
2 26 Feb 07 jari 90     }
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     
2 26 Feb 07 jari 93     public class Surface extends JPanel implements Runnable {
2 26 Feb 07 jari 94   
2 26 Feb 07 jari 95   public Thread thread;
2 26 Feb 07 jari 96   public long sleepAmount = 1000;
2 26 Feb 07 jari 97   private int w, h;
2 26 Feb 07 jari 98   private BufferedImage bimg;
2 26 Feb 07 jari 99   private Graphics2D big;
2 26 Feb 07 jari 100   private Font font = new Font("sansserif", Font.PLAIN, 11);
2 26 Feb 07 jari 101   private Runtime r = Runtime.getRuntime();
2 26 Feb 07 jari 102   private int columnInc;
2 26 Feb 07 jari 103   private int pts[];
2 26 Feb 07 jari 104   private int ptNum;
2 26 Feb 07 jari 105   private int ascent, descent;
2 26 Feb 07 jari 106   private float freeMemory, totalMemory;
2 26 Feb 07 jari 107   private Rectangle graphOutlineRect = new Rectangle();
2 26 Feb 07 jari 108   private Rectangle2D mfRect = new Rectangle2D.Float();
2 26 Feb 07 jari 109   private Rectangle2D muRect = new Rectangle2D.Float();
2 26 Feb 07 jari 110   private Line2D graphLine = new Line2D.Float();
2 26 Feb 07 jari 111   private Color graphColor = new Color(46, 139, 87);
2 26 Feb 07 jari 112   private Color mfColor = new Color(0, 100, 0);
2 26 Feb 07 jari 113   private String usedStr;
2 26 Feb 07 jari 114   
2 26 Feb 07 jari 115   
2 26 Feb 07 jari 116   public Surface() {
2 26 Feb 07 jari 117       setBackground(Color.black);
2 26 Feb 07 jari 118       addMouseListener(new MouseAdapter() {
2 26 Feb 07 jari 119     public void mouseClicked(MouseEvent e) {
2 26 Feb 07 jari 120         if (thread == null) start();// else stop();
2 26 Feb 07 jari 121     }
2 26 Feb 07 jari 122       });
2 26 Feb 07 jari 123   }
2 26 Feb 07 jari 124   
2 26 Feb 07 jari 125   public Dimension getMinimumSize() {
2 26 Feb 07 jari 126       return getPreferredSize();
2 26 Feb 07 jari 127   }
2 26 Feb 07 jari 128   
2 26 Feb 07 jari 129   public Dimension getMaximumSize() {
2 26 Feb 07 jari 130       return getPreferredSize();
2 26 Feb 07 jari 131   }
2 26 Feb 07 jari 132   
2 26 Feb 07 jari 133   public Dimension getPreferredSize() {
2 26 Feb 07 jari 134       return new Dimension(135,80);
2 26 Feb 07 jari 135   }
2 26 Feb 07 jari 136   
2 26 Feb 07 jari 137   
2 26 Feb 07 jari 138   public void paint(Graphics g) {
2 26 Feb 07 jari 139       
2 26 Feb 07 jari 140       if (big == null) {
2 26 Feb 07 jari 141     return;
2 26 Feb 07 jari 142       }
2 26 Feb 07 jari 143       
2 26 Feb 07 jari 144       big.setBackground(getBackground());
2 26 Feb 07 jari 145       big.clearRect(0,0,w,h);
2 26 Feb 07 jari 146       
2 26 Feb 07 jari 147       float freeMemory = (float) r.freeMemory();
2 26 Feb 07 jari 148       float totalMemory = (float) r.totalMemory();
2 26 Feb 07 jari 149       
2 26 Feb 07 jari 150       // .. Draw allocated and used strings ..
2 26 Feb 07 jari 151       big.setColor(Color.green);
2 26 Feb 07 jari 152       big.drawString(String.valueOf((int) totalMemory/1024) + "K allocated",  4.0f, (float) ascent+0.5f);
2 26 Feb 07 jari 153       usedStr = String.valueOf(((int) (totalMemory - freeMemory))/1024)
2 26 Feb 07 jari 154       + "K used";
2 26 Feb 07 jari 155       big.drawString(usedStr, 4, h-descent);
2 26 Feb 07 jari 156       
2 26 Feb 07 jari 157       // Calculate remaining size
2 26 Feb 07 jari 158       float ssH = ascent + descent;
2 26 Feb 07 jari 159       float remainingHeight = (float) (h - (ssH*2) - 0.5f);
2 26 Feb 07 jari 160       float blockHeight = remainingHeight/10;
2 26 Feb 07 jari 161       float blockWidth = 20.0f;
2 26 Feb 07 jari 162       float remainingWidth = (float) (w - blockWidth - 10);
2 26 Feb 07 jari 163       
2 26 Feb 07 jari 164       // .. Memory Free ..
2 26 Feb 07 jari 165       big.setColor(mfColor);
2 26 Feb 07 jari 166       int MemUsage = (int) ((freeMemory / totalMemory) * 10);
2 26 Feb 07 jari 167       int i = 0;
2 26 Feb 07 jari 168       for (; i < MemUsage ; i++) {
2 26 Feb 07 jari 169     mfRect.setRect(5,(float) ssH+i*blockHeight,
2 26 Feb 07 jari 170     blockWidth,(float) blockHeight-1);
2 26 Feb 07 jari 171     big.fill(mfRect);
2 26 Feb 07 jari 172       }
2 26 Feb 07 jari 173       
2 26 Feb 07 jari 174       // .. Memory Used ..
2 26 Feb 07 jari 175       big.setColor(Color.green);
2 26 Feb 07 jari 176       for (; i < 10; i++) {
2 26 Feb 07 jari 177     muRect.setRect(5,(float) ssH+i*blockHeight,
2 26 Feb 07 jari 178     blockWidth,(float) blockHeight-1);
2 26 Feb 07 jari 179     big.fill(muRect);
2 26 Feb 07 jari 180       }
2 26 Feb 07 jari 181       
2 26 Feb 07 jari 182       // .. Draw History Graph ..
2 26 Feb 07 jari 183       big.setColor(graphColor);
2 26 Feb 07 jari 184       int graphX = 30;
2 26 Feb 07 jari 185       int graphY = (int) ssH;
2 26 Feb 07 jari 186       int graphW = w - graphX - 5;
2 26 Feb 07 jari 187       int graphH = (int) remainingHeight;
2 26 Feb 07 jari 188       graphOutlineRect.setRect(graphX, graphY, graphW, graphH);
2 26 Feb 07 jari 189       big.draw(graphOutlineRect);
2 26 Feb 07 jari 190       
2 26 Feb 07 jari 191       int graphRow = graphH/10;
2 26 Feb 07 jari 192       
2 26 Feb 07 jari 193       // .. Draw row ..
2 26 Feb 07 jari 194       for (int j = graphY; j <= graphH+graphY; j += graphRow) {
2 26 Feb 07 jari 195     graphLine.setLine(graphX,j,graphX+graphW,j);
2 26 Feb 07 jari 196     big.draw(graphLine);
2 26 Feb 07 jari 197       }
2 26 Feb 07 jari 198       
2 26 Feb 07 jari 199       // .. Draw animated column movement ..
2 26 Feb 07 jari 200       int graphColumn = graphW/15;
2 26 Feb 07 jari 201       
2 26 Feb 07 jari 202       if (columnInc == 0) {
2 26 Feb 07 jari 203     columnInc = graphColumn;
2 26 Feb 07 jari 204       }
2 26 Feb 07 jari 205       
2 26 Feb 07 jari 206       for (int j = graphX+columnInc; j < graphW+graphX; j+=graphColumn) {
2 26 Feb 07 jari 207     graphLine.setLine(j,graphY,j,graphY+graphH);
2 26 Feb 07 jari 208     big.draw(graphLine);
2 26 Feb 07 jari 209       }
2 26 Feb 07 jari 210       
2 26 Feb 07 jari 211       --columnInc;
2 26 Feb 07 jari 212       
2 26 Feb 07 jari 213       if (pts == null) {
2 26 Feb 07 jari 214     pts = new int[graphW];
2 26 Feb 07 jari 215     ptNum = 0;
2 26 Feb 07 jari 216       } else if (pts.length != graphW) {
2 26 Feb 07 jari 217     int tmp[] = null;
2 26 Feb 07 jari 218     if (ptNum < graphW) {
2 26 Feb 07 jari 219         tmp = new int[ptNum];
2 26 Feb 07 jari 220         System.arraycopy(pts, 0, tmp, 0, tmp.length);
2 26 Feb 07 jari 221     } else {
2 26 Feb 07 jari 222         tmp = new int[graphW];
2 26 Feb 07 jari 223         System.arraycopy(pts, pts.length-tmp.length, tmp, 0, tmp.length);
2 26 Feb 07 jari 224         ptNum = tmp.length - 2;
2 26 Feb 07 jari 225     }
2 26 Feb 07 jari 226     pts = new int[graphW];
2 26 Feb 07 jari 227     System.arraycopy(tmp, 0, pts, 0, tmp.length);
2 26 Feb 07 jari 228       } else {
2 26 Feb 07 jari 229     big.setColor(Color.yellow);
2 26 Feb 07 jari 230     pts[ptNum] = (int)(graphY+graphH*(freeMemory/totalMemory));
2 26 Feb 07 jari 231     for (int j=graphX+graphW-ptNum, k=0;k < ptNum; k++, j++) {
2 26 Feb 07 jari 232         if (k != 0) {
2 26 Feb 07 jari 233       if (pts[k] != pts[k-1]) {
2 26 Feb 07 jari 234           big.drawLine(j-1, pts[k-1], j, pts[k]);
2 26 Feb 07 jari 235       } else {
2 26 Feb 07 jari 236           big.fillRect(j, pts[k], 1, 1);
2 26 Feb 07 jari 237       }
2 26 Feb 07 jari 238         }
2 26 Feb 07 jari 239     }
2 26 Feb 07 jari 240     if (ptNum+2 == pts.length) {
2 26 Feb 07 jari 241         // throw out oldest point
2 26 Feb 07 jari 242         for (int j = 1;j < ptNum; j++) {
2 26 Feb 07 jari 243       pts[j-1] = pts[j];
2 26 Feb 07 jari 244         }
2 26 Feb 07 jari 245         --ptNum;
2 26 Feb 07 jari 246     } else {
2 26 Feb 07 jari 247         ptNum++;
2 26 Feb 07 jari 248     }
2 26 Feb 07 jari 249       }
2 26 Feb 07 jari 250       g.drawImage(bimg, 0, 0, this);
2 26 Feb 07 jari 251   }
2 26 Feb 07 jari 252   
2 26 Feb 07 jari 253   
2 26 Feb 07 jari 254   public void start() {
2 26 Feb 07 jari 255       thread = new Thread(this);
2 26 Feb 07 jari 256       thread.setPriority(Thread.MIN_PRIORITY);
2 26 Feb 07 jari 257       thread.setName("MemoryMonitor");
2 26 Feb 07 jari 258       thread.start();
2 26 Feb 07 jari 259   }
2 26 Feb 07 jari 260   
2 26 Feb 07 jari 261   
2 26 Feb 07 jari 262   public synchronized void stop() {
2 26 Feb 07 jari 263       thread = null;
2 26 Feb 07 jari 264       notify();
2 26 Feb 07 jari 265   }
2 26 Feb 07 jari 266   
2 26 Feb 07 jari 267   
2 26 Feb 07 jari 268   public void run() {
2 26 Feb 07 jari 269       
2 26 Feb 07 jari 270       Thread me = Thread.currentThread();
2 26 Feb 07 jari 271       
2 26 Feb 07 jari 272       while (thread == me && !isShowing() || getSize().width == 0) {
2 26 Feb 07 jari 273     try {
2 26 Feb 07 jari 274         Thread.sleep(500);
2 26 Feb 07 jari 275     } catch (InterruptedException e) {
2 26 Feb 07 jari 276         return;
2 26 Feb 07 jari 277     }
2 26 Feb 07 jari 278       }
2 26 Feb 07 jari 279       
2 26 Feb 07 jari 280       while (thread == me && isShowing()) {
2 26 Feb 07 jari 281     Dimension d = getSize();
2 26 Feb 07 jari 282     if (d.width != w || d.height != h) {
2 26 Feb 07 jari 283         w = d.width;
2 26 Feb 07 jari 284         h = d.height;
2 26 Feb 07 jari 285         bimg = (BufferedImage) createImage(w, h);
2 26 Feb 07 jari 286         big = bimg.createGraphics();
2 26 Feb 07 jari 287         big.setFont(font);
2 26 Feb 07 jari 288         FontMetrics fm = big.getFontMetrics(font);
2 26 Feb 07 jari 289         ascent = (int) fm.getAscent();
2 26 Feb 07 jari 290         descent = (int) fm.getDescent();
2 26 Feb 07 jari 291     }
2 26 Feb 07 jari 292     repaint();
2 26 Feb 07 jari 293     try {
2 26 Feb 07 jari 294         Thread.sleep(sleepAmount);
2 26 Feb 07 jari 295     } catch (InterruptedException e) {
2 26 Feb 07 jari 296         break;
2 26 Feb 07 jari 297     }
2 26 Feb 07 jari 298     if (MemoryMonitor.dateStampCB.isSelected()) {
2 26 Feb 07 jari 299         System.out.println(new Date().toString() + " " + usedStr);
2 26 Feb 07 jari 300     }
2 26 Feb 07 jari 301       }
2 26 Feb 07 jari 302       thread = null;
2 26 Feb 07 jari 303   }
2 26 Feb 07 jari 304     }
2 26 Feb 07 jari 305     
2 26 Feb 07 jari 306     
2 26 Feb 07 jari 307     public static void main(String s[]) {
2 26 Feb 07 jari 308   final MemoryMonitor demo = new MemoryMonitor();
2 26 Feb 07 jari 309   WindowListener l = new WindowAdapter() {
2 26 Feb 07 jari 310       public void windowClosing(WindowEvent e) {System.exit(0);}
2 26 Feb 07 jari 311       public void windowDeiconified(WindowEvent e) { demo.surf.start();}
2 26 Feb 07 jari 312       //            public void windowIconified(WindowEvent e) { demo.surf.stop(); }
2 26 Feb 07 jari 313   };
2 26 Feb 07 jari 314   JFrame f = new JFrame("Java2D Demo - MemoryMonitor");
2 26 Feb 07 jari 315   f.addWindowListener(l);
2 26 Feb 07 jari 316   f.getContentPane().add("Center", demo);
2 26 Feb 07 jari 317   f.pack();
2 26 Feb 07 jari 318   f.setSize(new Dimension(200,200));
2 26 Feb 07 jari 319   f.show();
2 26 Feb 07 jari 320   demo.surf.start();
2 26 Feb 07 jari 321     }
2 26 Feb 07 jari 322 }