java2D~创建一个全屏应用程序,还有修改显示模式

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();
}
});
}

}


~最后运行的结果如下所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值