package javagames.render;
import java.awt.Container;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DisplayModeExample extends JFrame {
class DisplayModeWrapper {
/*
* DisplayMode 类封装 GraphicsDevice 的位深、高度、宽度和刷新.
*/
private DisplayMode dm;
public DisplayModeWrapper(DisplayMode dm) {
this.dm = dm;
}// 比较显示模式的高度和宽度,而不包括深度和刷新率。
public boolean equals(Object obj) {
DisplayModeWrapper other = (DisplayModeWrapper) obj;
if (dm.getWidth() != other.dm.getWidth())
return false;
if (dm.getHeight() != other.dm.getHeight())
return false;
return true;
}
public String toString() {
return "" + dm.getWidth() + "x" + dm.getHeight();
}
}
/*
* 将按钮或可编辑字段与下拉列表组合的组件。 用户可以从下拉列表中选择值,下拉列表在用户请求时显示。 如果使组合框处于可编辑状态,
* 则组合框将包括用户可在其中键入值的可编辑字段
*/
private JComboBox displayModes;
// GraphicsDevice 类描述可以在特定图形环境中使用的图形设备
private GraphicsDevicegraphicsDevice;
private DisplayModecurrentDisplayMode;
public DisplayModeExample() {
/*
* GraphicsEnvironment 类描述了 Java(tm) 应用程序在特定平台上可用的 GraphicsDevice 对象和
* Font 对象的集合。 此 GraphicsEnvironment
* 中的资源可以是本地资源,也可以位于远程机器上。GraphicsDevice 对象可以是屏幕、打印机或图像缓冲区,并且都是
* Graphics2D 绘图方法的目标。每个 GraphicsDevice 都有许多与之相关的 GraphicsConfiguration
* 对象。 这些对象指定了使用 GraphicsDevice 所需的不同配置。
*/
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
graphicsDevice = ge.getDefaultScreenDevice();// 返回默认的屏幕
currentDisplayMode = graphicsDevice.getDisplayMode();
}// getMainPanel 方法创建Swing组件
private JPanel getMainPanel() {
JPanel p = new JPanel();
displayModes = new JComboBox(listDisplayModes());
p.add(displayModes);
// 创建进入按钮
JButton enterButton = new JButton("Enter Full Sceen");
// 添加按钮事件
enterButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 点击按钮进入全屏
onEnterFullScreen();
}
});
// 把按钮加入面板
p.add(enterButton);
// 创见退出按钮
JButton exitButton = new JButton("Exit Full Screen");
// 创建退出按钮事件
exitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onExitFullScreen();
}
});
p.add(exitButton);
return p;
}
private DisplayModeWrapper[] listDisplayModes() {
ArrayList<DisplayModeWrapper> list = new ArrayList<DisplayModeWrapper>();
for (DisplayMode mode : graphicsDevice.getDisplayModes()) {
DisplayModeWrapper wrap = new DisplayModeWrapper(mode);
if (!list.contains(wrap)) {
list.add(wrap);
}
}
return list.toArray(new DisplayModeWrapper[0]);
}// createAndShowGUI方法创建并显示窗口
protected void createAndShowGUI() {
Container canvas = getContentPane();
canvas.add(getMainPanel());
canvas.setIgnoreRepaint(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Display Mode Test");
pack();
setVisible(true);
}
protected void onEnterFullScreen() {
// 支持全屏独占模式,只有授权时 isFullScreenSupported 才会返回 true
if (graphicsDevice.isFullScreenSupported()) {
DisplayMode newMode = getSelectedMode();
// void setFullScreenWindow() 进入全屏模式,或返回窗口化模式
graphicsDevice.setFullScreenWindow(this);
// 设置此图形设备的显示模式为newMode.
graphicsDevice.setDisplayMode(newMode);
}
}
// 设置onExitFullScreen()方法退出全屏
protected void onExitFullScreen() {
// 设置此图形设备的显示模式为currentDisplayMode
graphicsDevice.setDisplayMode(currentDisplayMode);
// 返回到窗口化模式
graphicsDevice.setFullScreenWindow(null);
}
/*
* getSelectedMode()方法真正地创建一个全新的DisplayMode 它带有一个未知的刷新频率,一边使用默认的刷新频率
*/
protected DisplayMode getSelectedMode() {
// 如果组合框可编辑,则可能尚未使用 addItem、insertItemAt 或数据构造方法将此值添加到组合框中
DisplayModeWrapper wrapper = (DisplayModeWrapper) displayModes.getSelectedItem();
DisplayMode dm = wrapper.dm;
// 宽度(用像素表示)赋值给width
int width = dm.getWidth();
// 高度(用像素表示)赋值给height
int height = dm.getHeight();
// 返回显示的位深给bit
int bit = dm.getBitDepth();
// 设置刷新率未知
int refresh = DisplayMode.REFRESH_RATE_UNKNOWN;
// 返回width,height,bit,refresh
return new DisplayMode(width, height, bit, refresh);
}
// 创建主方法显示窗口
public static void main(String args[]) {
final DisplayModeExample app = new DisplayModeExample();
/*
* 由于Swing库不是线程安全的,因此应该总是在Swing事件线程上创建并展示JFrame。 然而
* 该程序的main()方法并不是在事件线程上调用。因此,必须使用SwingUtilities类
* 来启动这个窗口。通过使用SwingUtilities类,创建GUI组件。
*/
SwingUtilities.invokeLater(new Runnable() {
/*
* 这个invokeLater()方法在所有挂起的 AWT 事件被处理后才发生。 此方法应该在应用程序线程需要更新该 GUI 时使 用。
*/
@Override
public void run() {
app.createAndShowGUI();
}
});
}
import java.awt.Container;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DisplayModeExample extends JFrame {
class DisplayModeWrapper {
/*
* DisplayMode 类封装 GraphicsDevice 的位深、高度、宽度和刷新.
*/
private DisplayMode dm;
public DisplayModeWrapper(DisplayMode dm) {
this.dm = dm;
}// 比较显示模式的高度和宽度,而不包括深度和刷新率。
public boolean equals(Object obj) {
DisplayModeWrapper other = (DisplayModeWrapper) obj;
if (dm.getWidth() != other.dm.getWidth())
return false;
if (dm.getHeight() != other.dm.getHeight())
return false;
return true;
}
public String toString() {
return "" + dm.getWidth() + "x" + dm.getHeight();
}
}
/*
* 将按钮或可编辑字段与下拉列表组合的组件。 用户可以从下拉列表中选择值,下拉列表在用户请求时显示。 如果使组合框处于可编辑状态,
* 则组合框将包括用户可在其中键入值的可编辑字段
*/
private JComboBox displayModes;
// GraphicsDevice 类描述可以在特定图形环境中使用的图形设备
private GraphicsDevicegraphicsDevice;
private DisplayModecurrentDisplayMode;
public DisplayModeExample() {
/*
* GraphicsEnvironment 类描述了 Java(tm) 应用程序在特定平台上可用的 GraphicsDevice 对象和
* Font 对象的集合。 此 GraphicsEnvironment
* 中的资源可以是本地资源,也可以位于远程机器上。GraphicsDevice 对象可以是屏幕、打印机或图像缓冲区,并且都是
* Graphics2D 绘图方法的目标。每个 GraphicsDevice 都有许多与之相关的 GraphicsConfiguration
* 对象。 这些对象指定了使用 GraphicsDevice 所需的不同配置。
*/
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
graphicsDevice = ge.getDefaultScreenDevice();// 返回默认的屏幕
currentDisplayMode = graphicsDevice.getDisplayMode();
}// getMainPanel 方法创建Swing组件
private JPanel getMainPanel() {
JPanel p = new JPanel();
displayModes = new JComboBox(listDisplayModes());
p.add(displayModes);
// 创建进入按钮
JButton enterButton = new JButton("Enter Full Sceen");
// 添加按钮事件
enterButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 点击按钮进入全屏
onEnterFullScreen();
}
});
// 把按钮加入面板
p.add(enterButton);
// 创见退出按钮
JButton exitButton = new JButton("Exit Full Screen");
// 创建退出按钮事件
exitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onExitFullScreen();
}
});
p.add(exitButton);
return p;
}
private DisplayModeWrapper[] listDisplayModes() {
ArrayList<DisplayModeWrapper> list = new ArrayList<DisplayModeWrapper>();
for (DisplayMode mode : graphicsDevice.getDisplayModes()) {
DisplayModeWrapper wrap = new DisplayModeWrapper(mode);
if (!list.contains(wrap)) {
list.add(wrap);
}
}
return list.toArray(new DisplayModeWrapper[0]);
}// createAndShowGUI方法创建并显示窗口
protected void createAndShowGUI() {
Container canvas = getContentPane();
canvas.add(getMainPanel());
canvas.setIgnoreRepaint(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Display Mode Test");
pack();
setVisible(true);
}
protected void onEnterFullScreen() {
// 支持全屏独占模式,只有授权时 isFullScreenSupported 才会返回 true
if (graphicsDevice.isFullScreenSupported()) {
DisplayMode newMode = getSelectedMode();
// void setFullScreenWindow() 进入全屏模式,或返回窗口化模式
graphicsDevice.setFullScreenWindow(this);
// 设置此图形设备的显示模式为newMode.
graphicsDevice.setDisplayMode(newMode);
}
}
// 设置onExitFullScreen()方法退出全屏
protected void onExitFullScreen() {
// 设置此图形设备的显示模式为currentDisplayMode
graphicsDevice.setDisplayMode(currentDisplayMode);
// 返回到窗口化模式
graphicsDevice.setFullScreenWindow(null);
}
/*
* getSelectedMode()方法真正地创建一个全新的DisplayMode 它带有一个未知的刷新频率,一边使用默认的刷新频率
*/
protected DisplayMode getSelectedMode() {
// 如果组合框可编辑,则可能尚未使用 addItem、insertItemAt 或数据构造方法将此值添加到组合框中
DisplayModeWrapper wrapper = (DisplayModeWrapper) displayModes.getSelectedItem();
DisplayMode dm = wrapper.dm;
// 宽度(用像素表示)赋值给width
int width = dm.getWidth();
// 高度(用像素表示)赋值给height
int height = dm.getHeight();
// 返回显示的位深给bit
int bit = dm.getBitDepth();
// 设置刷新率未知
int refresh = DisplayMode.REFRESH_RATE_UNKNOWN;
// 返回width,height,bit,refresh
return new DisplayMode(width, height, bit, refresh);
}
// 创建主方法显示窗口
public static void main(String args[]) {
final DisplayModeExample app = new DisplayModeExample();
/*
* 由于Swing库不是线程安全的,因此应该总是在Swing事件线程上创建并展示JFrame。 然而
* 该程序的main()方法并不是在事件线程上调用。因此,必须使用SwingUtilities类
* 来启动这个窗口。通过使用SwingUtilities类,创建GUI组件。
*/
SwingUtilities.invokeLater(new Runnable() {
/*
* 这个invokeLater()方法在所有挂起的 AWT 事件被处理后才发生。 此方法应该在应用程序线程需要更新该 GUI 时使 用。
*/
@Override
public void run() {
app.createAndShowGUI();
}
});
}
}
~最后运行的结果如下所示: