⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmstate.java

📁 小游戏--淘金者 主要用到了双缓冲平面作图
💻 JAVA
字号:
package bin;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.util.Date;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.JPanel;

/*首先,构造方法把一个引用 frame保存JFrame实例,
 *然后调用updateBackground()方法,利用java.awt.Robot类捕获到整个屏幕,
 *并把捕获到的图像保存到一个定义了的放置背景的变量background中.
 * paintComponent()方法用于获得窗口在屏幕上的绝对位置,
 *并用刚刚得到的背景作为panel的背景图,同时这个背景图会因为panel
 *位置的不同而作对应的移动,以使panel的背景和panel覆盖的那部分屏
 *幕图像无缝重叠在一起,同时也就使panel和周围的屏幕关联起来.
*/
 class StateFrame extends JComponent 
              implements ComponentListener, WindowFocusListener,Runnable { 
  													 
    private JFrame frame; 			
    private Image background;
    private long lastupdate = 0;
    public boolean refreshRequested = true;
   // private Timer t;
    
    
    public StateFrame(JFrame frame) { 
        this.frame = frame;
        updateBackground( );						
        frame.addComponentListener(this); 					
        frame.addWindowFocusListener(this);
        new Thread(this).start( );
      
    }

 
    public void updateBackground( ) {
      try {
	        Robot rbt = new Robot( );			
	        Toolkit tk = Toolkit.getDefaultToolkit( );
	        Dimension dim = tk.getScreenSize( );
	        background = rbt.createScreenCapture(new Rectangle(0,0,(int)dim.getWidth( ),
	        (int)dim.getHeight( ))); 			 
      	}										
				
      	 catch (Exception ex) {
//        p(ex.toString( ));
        ex.printStackTrace( );
      }
    }
    /**
     *  通过当前frame的大小和位置在 background背景中截取图
     *  作为当前frame的背景图片
     */
    public void paintComponent(Graphics g) {
      Point pos = this.getLocationOnScreen( );		//获得窗体相对与屏幕的当前坐标
      Point offset = new Point(-pos.x,-pos.y);
      g.drawImage(background,offset.x,offset.y,null);//绘制
    }
    
	//每当触发这些事件,窗体将重绘
    public void componentShown(ComponentEvent evt) { repaint( ); }
    public void componentResized(ComponentEvent evt) { repaint( ); }
    public void componentMoved(ComponentEvent evt) { repaint( ); }
    public void componentHidden(ComponentEvent evt) { }
    public void windowGainedFocus(WindowEvent evt) {System.out.println(0); refresh( ); }    
    public void windowLostFocus(WindowEvent evt) { System.out.println(1);refresh( ); }

    /**
     * 用上面获取的图片更新背景 
     * 适时调用repaint();
     * 
     */
    public void refresh( ) {
      if(frame.isVisible( )) {
          repaint( );
          refreshRequested = true;
          lastupdate = new Date( ).getTime( );
      }
    }
    
    
    public void run( ) {
      try {
          while(true) 
          {
              Thread.sleep(250);
              long now = new Date( ).getTime( );
              if(refreshRequested &&((now - lastupdate) > 1000)) 
              {
                  if(frame.isVisible( )) 
                  {
                      //Point location = frame.getLocation( );
                     // frame.setVisible(false );
                     // updateBackground( );
                      //frame.setVisible(true );
                  	  //frame.setLocation(location);
                      //refresh( );System.out.println(2);
                  }
                  lastupdate = now;			
                  refreshRequested = false;
              }
              frame.setFocusable(false);
          }
          } catch (Exception ex) {
             ex.printStackTrace( );
          } 
      }
   
    public static void createFrmState(final JFrame mapFrame) {
      
      JFrame frame = new JFrame("state");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
      frame.setUndecorated(true);
      
      StateFrame bg = new StateFrame(frame);
      bg.setLayout(new BorderLayout( )); 
           

                                   //创建状态栏面板
      StatePanel panel =new StatePanel(frame);
      bg.add(panel);
      
      frame.getContentPane( ).add("Center",bg);
      frame.pack( );				//调整此窗口的大小,以适合其子组件的首选大小和布局。
      frame.setSize(200,0);
        
      frame.setLocation(mapFrame.getX()+mapFrame.getWidth(),mapFrame.getY()); 
      frame.setVisible(true);
      
      new FrameMove().install(frame); //移动处理  
      								   //动态增加窗体高度事件
      AddFrameSize listener = new AddFrameSize(bg.frame);
	  Timer t = new Timer(10, listener);
	  t.start();
	  if(listener.getStop())
	  {
	  	t.stop();
	  }
    }
    
    
}
class AddFrameSize implements ActionListener	//控制输入面板增长的事件
{  
    
	private JFrame frame; 
	public static int height=0;
	public static int width=0;
	public boolean flag=false;
	private boolean isStop;
	public AddFrameSize(JFrame frame)
	{
		this.frame=frame;	
		width=frame.getWidth();
		height=frame.getHeight();
		
	}
   public void actionPerformed(ActionEvent event)
   {
	  
	  if(height!=400)
	  {
	  	
	  	frame.setSize(width,height);
	  	height+=25;
	  }
	  else 
	  {
	  	
	  	isStop=true;
	  }
	  
   }
   public boolean getStop()
   {
   	return isStop;
   }
  

}

⌨️ 快捷键说明

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