src/demo/share/jfc/J2Ddemo/java2d/PerformanceMonitor.java
changeset 50146 0bb0e464ee76
equal deleted inserted replaced
50145:752645a158ff 50146:0bb0e464ee76
       
     1 /*
       
     2  *
       
     3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  *
       
     9  *   - Redistributions of source code must retain the above copyright
       
    10  *     notice, this list of conditions and the following disclaimer.
       
    11  *
       
    12  *   - Redistributions in binary form must reproduce the above copyright
       
    13  *     notice, this list of conditions and the following disclaimer in the
       
    14  *     documentation and/or other materials provided with the distribution.
       
    15  *
       
    16  *   - Neither the name of Oracle nor the names of its
       
    17  *     contributors may be used to endorse or promote products derived
       
    18  *     from this software without specific prior written permission.
       
    19  *
       
    20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    31  */
       
    32 package java2d;
       
    33 
       
    34 
       
    35 import java.awt.BorderLayout;
       
    36 import java.awt.Color;
       
    37 import java.awt.Component;
       
    38 import java.awt.Dimension;
       
    39 import java.awt.Font;
       
    40 import java.awt.FontMetrics;
       
    41 import java.awt.Graphics;
       
    42 import java.awt.Graphics2D;
       
    43 import java.awt.event.MouseAdapter;
       
    44 import java.awt.event.MouseEvent;
       
    45 import java.awt.image.BufferedImage;
       
    46 import javax.swing.JPanel;
       
    47 import javax.swing.border.EtchedBorder;
       
    48 import javax.swing.border.TitledBorder;
       
    49 
       
    50 
       
    51 /**
       
    52  * Displays the time for a Surface to paint. Displays the number
       
    53  * of frames per second on animated demos.  Up to four surfaces fit
       
    54  * in the display area.
       
    55  */
       
    56 @SuppressWarnings("serial")
       
    57 public class PerformanceMonitor extends JPanel {
       
    58 
       
    59     Surface surf;
       
    60 
       
    61     public PerformanceMonitor() {
       
    62         setLayout(new BorderLayout());
       
    63         setBorder(new TitledBorder(new EtchedBorder(), "Performance"));
       
    64         add(surf = new Surface());
       
    65     }
       
    66 
       
    67 
       
    68     public class Surface extends JPanel implements Runnable {
       
    69 
       
    70         public Thread thread;
       
    71         private BufferedImage bimg;
       
    72         private Font font = new Font(Font.SERIF, Font.PLAIN, 12);
       
    73         private JPanel panel;
       
    74 
       
    75         public Surface() {
       
    76             setBackground(Color.black);
       
    77             addMouseListener(new MouseAdapter() {
       
    78 
       
    79                 @Override
       
    80                 public void mouseClicked(MouseEvent e) {
       
    81                     if (thread == null) {
       
    82                         start();
       
    83                     } else {
       
    84                         stop();
       
    85                     }
       
    86                 }
       
    87             });
       
    88         }
       
    89 
       
    90         @Override
       
    91         public Dimension getMinimumSize() {
       
    92             return getPreferredSize();
       
    93         }
       
    94 
       
    95         @Override
       
    96         public Dimension getMaximumSize() {
       
    97             return getPreferredSize();
       
    98         }
       
    99 
       
   100         @Override
       
   101         public Dimension getPreferredSize() {
       
   102             int textH = getFontMetrics(font).getHeight();
       
   103             return new Dimension(135, 2 + textH * 4);
       
   104         }
       
   105 
       
   106         @Override
       
   107         public void paint(Graphics g) {
       
   108             if (bimg != null) {
       
   109                 g.drawImage(bimg, 0, 0, this);
       
   110             }
       
   111         }
       
   112 
       
   113         public void start() {
       
   114             thread = new Thread(this);
       
   115             thread.setPriority(Thread.MIN_PRIORITY);
       
   116             thread.setName("PerformanceMonitor");
       
   117             thread.start();
       
   118         }
       
   119 
       
   120         public synchronized void stop() {
       
   121             thread = null;
       
   122             setSurfaceState();
       
   123             notify();
       
   124         }
       
   125 
       
   126         public void setSurfaceState() {
       
   127             if (panel != null) {
       
   128                 for (Component comp : panel.getComponents()) {
       
   129                     if (((DemoPanel) comp).surface != null) {
       
   130                         ((DemoPanel) comp).surface.setMonitor(thread != null);
       
   131                     }
       
   132                 }
       
   133             }
       
   134         }
       
   135 
       
   136         public void setPanel(JPanel panel) {
       
   137             this.panel = panel;
       
   138         }
       
   139 
       
   140         @Override
       
   141         @SuppressWarnings("SleepWhileHoldingLock")
       
   142         public void run() {
       
   143 
       
   144             Thread me = Thread.currentThread();
       
   145 
       
   146             while (thread == me && !isShowing() || getSize().width == 0) {
       
   147                 try {
       
   148                     Thread.sleep(500);
       
   149                 } catch (InterruptedException e) {
       
   150                     return;
       
   151                 }
       
   152             }
       
   153 
       
   154             Dimension d = new Dimension(0, 0);
       
   155             Graphics2D big = null;
       
   156             FontMetrics fm = null;
       
   157             int ascent = 0;
       
   158             int descent = 0;
       
   159 
       
   160             while (thread == me && isShowing()) {
       
   161 
       
   162                 if (getWidth() != d.width || getHeight() != d.height) {
       
   163                     d = getSize();
       
   164                     bimg = (BufferedImage) createImage(d.width, d.height);
       
   165                     big = bimg.createGraphics();
       
   166                     big.setFont(font);
       
   167                     fm = big.getFontMetrics();
       
   168                     ascent = fm.getAscent();
       
   169                     descent = fm.getDescent();
       
   170                     setSurfaceState();
       
   171                 }
       
   172 
       
   173                 big.setBackground(getBackground());
       
   174                 big.clearRect(0, 0, d.width, d.height);
       
   175                 if (panel == null) {
       
   176                     continue;
       
   177                 }
       
   178                 big.setColor(Color.green);
       
   179                 int ssH = 1;
       
   180                 for (Component comp : panel.getComponents()) {
       
   181                     if (((DemoPanel) comp).surface != null) {
       
   182                         String pStr = ((DemoPanel) comp).surface.perfStr;
       
   183                         if (pStr != null) {
       
   184                             ssH += ascent;
       
   185                             big.drawString(pStr, 4, ssH + 1);
       
   186                             ssH += descent;
       
   187                         }
       
   188                     }
       
   189                 }
       
   190                 repaint();
       
   191 
       
   192                 try {
       
   193                     Thread.sleep(999);
       
   194                 } catch (InterruptedException e) {
       
   195                     break;
       
   196                 }
       
   197             }
       
   198             thread = null;
       
   199         }
       
   200     } // End Surface
       
   201 } // End PeformanceMonitor
       
   202