volatileimagetest.java

来自「java learn PPT java learn PPT java learn」· Java 代码 · 共 160 行

JAVA
160
字号
     import java.applet.*;
     import java.awt.*;
     import java.awt.event.*;
     import java.awt.image.*;
     import java.awt.geom.*;

     public class VolatileImageTest extends Applet implements ItemListener
     {
          // 动画线程
          private Thread animation;

          // 屏外绘制图像
          private Image offscreen;

          // 平铺图像 
          private Image tile;

          // 平铺图像的宽和高
          private int tileWidth;
          private int tileHeight;

          // 允许用户在屏外绘制加速和不加速中做出选择
          private Checkbox accelerated;          

          public void init()
          {
              // 创建平铺图像
              tile = getImage(getDocumentBase(), "bevel.gif"); 
              while(tile.getWidth(this) <= 0);

              tileWidth = tile.getWidth(this);
              tileHeight = tile.getHeight(this);

              // 创建单选按钮
              setLayout(new BorderLayout());
              accelerated = new Checkbox("use accelerated image", null, true);
              accelerated.addItemListener(this);
              Panel p = new Panel();
              p.add(accelerated);
              add(p, BorderLayout.SOUTH);
           
              // 创建屏外绘制图像
              createOffscreenImage(accelerated.getState());

          }   // init

          // 根据传入的参数创建VolatileImage或者BufferedImage
          private void createOffscreenImage(boolean createAccelerated)
          {
              if(createAccelerated) 
              {
                   // 创建加速图像 
                   offscreen = 
                   getGraphicsConfiguration().createCompatibleVolatileImage(getSize().width, getSize().height);
              }

              else
              {   
                   // 否则,只是创建一个老式的BufferedImage
                   offscreen = 
                   getGraphicsConfiguration().createCompatibleImage(getSize().width, getSize().height);
              }
          } 

          public void update(Graphics g)
          {
               // 计算1000绘制画面所耗费的时间
           
               long time = System.currentTimeMillis();

               for(int i = 0; i < 1000; i++)
               {
                    paint(g);
               }

               if(offscreen instanceof VolatileImage)               
               {
                    System.out.println("It took " + (System.currentTimeMillis() - time) + " ms to render " +
                         " the scene 1000 times using an accelerated image.");
               }

               else
               {
                    System.out.println("It took " + (System.currentTimeMillis() - time) + " ms to render " +
                         "the scene 1000 times using an non-accelerated image.");
               }
          }     

          public void paint(Graphics g) 
          {
               // 校验屏外图像并绘制画面

               if(offscreen instanceof VolatileImage)
               {
                    VolatileImage volatileImage = (VolatileImage) offscreen;
  
                    do 
                    {
                         // 如果屏外图像无效的话则重置它
                         if(volatileImage.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE)
                         {
                              createOffscreenImage(true);
                         }

                         // 绘制画面
                         paintScene(volatileImage.getGraphics());

                         // 如果内容丢失则循环
                    }    while(volatileImage.contentsLost());

               }

               else
               {
                    if(offscreen == null ||
                       offscreen.getWidth(null)  != getSize().width || 
                       offscreen.getHeight(null) != getSize().height
                       )
                    {
                         createOffscreenImage(false);
                    }

                    paintScene(offscreen.getGraphics());
               }

               // 在applet窗体上绘制屏外图像
               g.drawImage(offscreen, 0, 0, this);
      
          }    // paint

          private void paintScene(Graphics g)
          {
               // 在applet窗体内平铺图像

               Graphics2D g2d = (Graphics2D) g;

               int width  = getSize().width;
               int height = getSize().height;
               for(int y = 0; y < height; y += tileHeight)
               {
                    for(int x = 0; x < width; x += tileWidth)
                    {
                         g2d.drawImage(tile, x, y, this);
                    }
               }

               // 破弃Graphics对象可能使用的资源
               g2d.dispose();
          }

          public void itemStateChanged(ItemEvent e)
          {
               if(accelerated == e.getSource())
               {
                    createOffscreenImage(accelerated.getState());
                    repaint();
               }
          }

     }    // VolatileImageTest  

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?