| 類/方法 | 作用 |
| GraphicsEnvironment.getLocalGraphicsEnvironment() | 獲取本地圖形環境單例 |
| GraphicsEnvironment.getDefaultScreenDevice() | 獲取默認屏幕設備 |
| GraphicsDevice.isFullScreenSupported() | 檢查是否支持全屏模式 |
| GraphicsDevice.setFullScreenWindow(Window) | 啟用/退出全屏模式 |
完整示例代碼
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JWindow;
public class FullScreenTest {
public static void main(String[] args) {
// 1. 獲取圖形環境與默認屏幕設備
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
// 2. 創建全屏窗口(JWindow 無標題欄邊框)
FullScreenWindow window = new FullScreenWindow();
// 3. 檢查支持並啟用全屏
if (gd.isFullScreenSupported()) {
gd.setFullScreenWindow(window);
} else {
System.out.println("當前環境不支持全屏模式");
// 降級方案:最大化 JFrame
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
}
static class FullScreenWindow extends JWindow {
public FullScreenWindow() {
// 點擊任意位置退出全屏
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
quit();
}
});
}
public void quit() {
dispose(); // 釋放資源,自動退出全屏模式
}
@Override
public void paint(Graphics g) {
// 繪製全屏內容
g.setFont(new Font("Arial", Font.BOLD, 30));
g.setColor(Color.RED);
g.drawString("這是全屏幕模式", 100, 100);
// 可繪製圖片、動畫、遊戲幀等
}
}
}
關鍵技術點
1. JWindow vs JFrame
JWindow:無標題欄、無邊框、無最小化/最大化/關閉按鈕,純粹的矩形繪製區域,最適合全屏
JFrame:有窗口裝飾,全屏前需 setUndecorated(true) 移除邊框
2. 退出全屏的正確方式
// 方式一:dispose() 窗口(推薦)
window.dispose();
// 方式二:傳入 null 給設備
gd.setFullScreenWindow(null);
注意:單獨調用 setVisible(false) 不會退出全屏模式,必須 dispose() 或傳 null。
3. 顯示模式切換(分辨率/色深/刷新率)
DisplayMode[] modes = gd.getDisplayModes();
// 選擇合適模式,如 1920x1080 32bit 60Hz
DisplayMode target = new DisplayMode(1920, 1080, 32, 60);
if (gd.isDisplayChangeSupported()) {
gd.setDisplayMode(target);
gd.setFullScreenWindow(window);
}
// 退出時恢復
gd.setDisplayMode(originalMode);
4. 多屏環境處理
GraphicsDevice[] devices = ge.getScreenDevices();
// devices[0] 通常為主屏,devices[1] 為副屏
// 可在不同屏幕啟用不同全屏窗口
常見問題與解決方案
| 問題 | 原因 | 解決 |
| isFullScreenSupported() 返回 false | 某些 Linux 窗口管理器/遠程桌面不支持 | 降級用 JFrame MAXIMIZED_BOTH + undecorated |
| 全屏後無法獲得焦點/鍵盤無響應 | 窗口未請求焦點 | window.requestFocusInWindow() 或 window.setFocusableWindowState(true) |
| 退出全屏後分辨率未恢復 | 未保存原始 DisplayMode | 進入前保存 gd.getDisplayMode(),退出時恢復 |
| Mac 上全屏行為異常 | macOS 有獨立全屏機制 | 使用 JFrame + setExtendedState(MAXIMIZED_BOTH) 替代 |
最佳實踐清單
- 啟用前檢查
isFullScreenSupported()
- 使用
JWindow 或 undecorated JFrame
- 提供明確退出方式(Esc 鍵、點擊、菜單)
- 保存並恢復原始
DisplayMode
- 在
paint() 中繪製,或使用 BufferStrategy 雙緩衝渲染
- 全屏期間禁用屏保/休眠(需 JNI 或平台特定 API)
BufferStrategy 高性能渲染
// 在全屏窗口中創建雙緩衝
window.createBufferStrategy(2);
BufferStrategy bs = window.getBufferStrategy();
while (running) {
Graphics g = bs.getDrawGraphics();
try {
// 清屏
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
// 繪製遊戲幀...
renderGame(g);
} finally {
g.dispose();
}
bs.show(); // 翻轉緩衝區顯示
Toolkit.getDefaultToolkit().sync(); // 同步顯示
}
全屏模式是 Java 客戶端應用實現沉浸式體驗的關鍵技術。掌握 GraphicsDevice API、窗口生命週期管理、顯示模式切換與渲染策略,可構建專業級全屏應用(遊戲、數字標牌、演示系統等)。
- 上一篇文章: Java 2D 圖像縮放特效實現
- 下一篇文章: Swing 代碼調試與測試:Swing Explorer 與 FEST-Swing 實戰
Copyright ©
程式碼之家 All Rights Reserved