我写了一段代码,在awt 和swing 中通用:
Boolean fullsm; //定义一个类成员变量,配合按键和监听事件使用。
public void setwindows() {
// dispose(); //退出显示时清理资源
// this.setUndecorated(false); //设置标题
// this.setVisible(false);
this.getGraphicsConfiguration().getDevice().setFullScreenWindow(null); //关键代码只有一句
this.setSize(SCREENW, SCREENH); //屏幕的宽和高
this.addWindowListener(new WindowAdapter() {//设置退出监听
public voidwindowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
setVisible(true);
//从此处开始实现让窗口显示自动居中的功能
Toolkit tk = Toolkit.getDefaultToolkit();
Dimensiond = tk.getScreenSize();
double x = d.getWidth(); //得到的屏幕宽
double y = d.getHeight(); //得到屏幕高
int w = (int) (x - SCREENW) / 2;
int h = (int) (y - SCREENH) / 2;
if (w > 0 && h > 0) {
this.setLocation(w, h);
}else{
this.setLocation(1, 1);
}
fullsm= false;
}
public void setfullsm() {
// dispose();
// this.setUndecorated(true);
// this.setVisible(false);
this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this);
fullsm= true;
}
其中包含几个意思:
1、 方法可以配合监听事件或按键使用,具体我就不做演示了。引用对象要继承自 Frame 或 Jframe等组件。
2、 被我注释掉的3段代码
// dispose();
// this.setUndecorated(false);
// this.setVisible(false);
是一种释放窗口资源的写法,但经我的测试,若你设置了按键adapter,这3段代码会产生问题:按键会短暂失灵,对于游戏这意味着什么?
另,实际我也测试了,在多次全屏-窗口-全屏-窗口切换后,系统资源并没用显著变化。
所以,dispose();能不用就不用吧。
3、 在全屏切换后,超出的屏幕区域会遗留以前被paint的精灵等,这时最好通过对屏幕尺寸进行计算,在paint()方法的最后绘制出多余区域的遮挡,甚至可以放上一些logo在多余后的区域。我是这样做的:
if (fullsm) {
g.setColor(new Color(255, 255, 237));
g.fillRect(SCREENW, 0, (int) x- SCREENW, (int) y); //绘制遮挡
g.fillRect(0, SCREENH, (int) x, (int) y- SCREENH); //绘制遮挡
if (x > SCREENH+100){ //判断屏幕是否有充足多余位置,若有可以放上logo。
g.setColor(new Color(255, 51, 102));
Fontfull= newFont("宋体", Font.ITALIC, 34);
g.setFont(full);
g.drawString("任意内容 ", (int) x-399, (int)y-54);
}
}
一定要在paint()最后绘制, 不然也遮挡不了。
4、本程序包括一个让窗口显示自动居中的功能。