内容摘要:您是否喜欢让程序搞一些恶作剧,让别人感到不舒服?如果您回答“是”,那么这个月的技巧文章一定对您的胃口。使用J2SE1.4,您的Java程序现在可以更改视频…
您是否喜欢让程序搞一些恶作剧,让别人感到不舒服?如果您回答“是”,那么这个月的技巧文章一定对您的胃口。使用 J2SE 1.4,您的 Java 程序现在可以更改视频方式并获得对屏幕的绝对控制。您不必让别人随心所欲地玩电脑;您差不多可以拥有整个控制权。感谢新的全屏幕独占模式(FEM)API 为我们提供了这个无与伦比的强大功能。
即使您回答“不”,不想以惹恼他人来取乐,您也将发现 FEM API 提供了许多帮助。通过直接对显存进行写操作,FEM API 提供了对显示的完全控制 ― 这对于游戏开发来说十分理想,虽然还有许多其它应用。例如,一些程序只有用特定大小的屏幕看上去才更好,并且才能更好地工作。请继续读下去,以发掘您内心有关控制方面的奇思怪想。
更改显示方式
让我们先从研究 FEM API 的 Java.awt.DislayMode 类开始,该类包装了特定显示方式的屏幕大小和刷新频率。受支持的方式特定于系统的硬件支持。
要找出特定系统的受支持方式,请查看 GraphicsEnvironment 。通过该环境,您可以获得缺省屏幕设备 GraphicDevice ,通过该屏幕设备可以获得显示方式,如清单 1 所示:
清单 1. 查找显示方式
GraphicsEnvironment graphicsEnvironment =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice =
graphicsEnvironment.getDefaultScreenDevice();
DisplayMode displayModes[] =
graphicsDevice.getDisplayModes();
还可以使用 getDisplayMode() 方法获得当前的显示模式,如清单 2 所示:
清单 2. 获得当前的显示方式
DisplayMode originalDisplayMode =
graphicsDevice.getDisplayMode();
更改方式经证实相对容易些,但必须先利用 GraphicsDevice 的 isDisplayChangeSupported() 方法询问所涉及的图形设备是否支持更改。
一旦知道了这一点,要更改方式,使用 setDisplayMode() 方法,以传入新方式。显示方式更改一般在 try / finally 块中发生,以便于 finally 块将代码复位成初始方式。虽然该过程不是绝对必需的,但它可以确保在程序完成时有一个安全的方式。清单 3 显示了用于更改显示方式的典型模式:
清单 3. 更改方式
GraphicsDevice graphicsDevice = …
DisplayMode originalDisplayMode = graphicsDevice.getDisplayMode();
DisplayMode newDisplayMode = …
try {
if (graphicsDevice.isDisplayChangeSupported()) {
graphicsDevice.setDisplayMode(newDisplayMode);
}
} finally {
graphicsDevice.setDisplayMode(originalDisplayMode);
}
使用全屏幕窗口
使用 FEM API,进入全屏幕窗口是轻而易举的:只要将 window 传递给 GraphicsDevice 的 setFullScreenWindow() 方法,如清单 4 所示。当您想要返回非全屏幕方式时,将 null 传递给该方法。当然,先通过使用 isFullScreenSupported() 方法来检查 GraphicsDevice 是否支持全屏幕方式。
清单 4. 进入全屏幕方式
GraphicsDevice graphicsDevice = …
Window window = …
try {
if (graphicsDevice.isFullScreenSupported()) {
graphicsDevice.setFullScreenWindow(window);
}
} finally {
graphicsDevice.setFullScreenWindow(null);
}
为了说明目前为止您所学的所有内容,清单 5 包含了一个完整示例。清单 5 中的代码获得显示方式,随机选择一个方式进行更改,然后显示一个带有文本“Hello, World!”的全屏幕窗口。该示例显示新显示方式的特征,这样您可以看到特定的屏幕大小、刷新频率和色深(bit depth)。
清单 5. 方式更改示例
import
Java.awt.*;
import Javax.swing.*;
import Java.util.Random;
public class DisplayModes {
public static void main(String args[]) {
GraphicsEnvironment graphicsEnvironment =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice =
graphicsEnvironment.getDefaultScreenDevice();
DisplayMode displayModes[] = graphicsDevice.getDisplayModes();
DisplayMode originalDisplayMode = graphicsDevice.getDisplayMode();
JWindow window = new JWindow() {
public void paint(Graphics g) {
g.setColor(Color.blue);
g.drawString("Hello, World!", 50, 50);
}
};