📄 frmstate.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 + -