首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 全屏模式編程指南

     編輯:Java 相關知識

Java 提供 GraphicsDevice.setFullScreenWindow() 實現獨佔全屏模式,適用於遊戲、演示軟件、圖片查看器等需要最大化顯示區域的場景。本文詳細講解全屏模式啟用流程、關鍵 API、退出機制及完整示例。

核心類與流程

完整示例代碼

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] 為副屏
// 可在不同屏幕啟用不同全屏窗口

常見問題與解決方案

類/方法作用
GraphicsEnvironment.getLocalGraphicsEnvironment()獲取本地圖形環境單例
GraphicsEnvironment.getDefaultScreenDevice()獲取默認屏幕設備
GraphicsDevice.isFullScreenSupported()檢查是否支持全屏模式
GraphicsDevice.setFullScreenWindow(Window)啟用/退出全屏模式
問題原因解決
isFullScreenSupported() 返回 false某些 Linux 窗口管理器/遠程桌面不支持降級用 JFrame MAXIMIZED_BOTH + undecorated
全屏後無法獲得焦點/鍵盤無響應窗口未請求焦點window.requestFocusInWindow() 或 window.setFocusableWindowState(true)
退出全屏後分辨率未恢復未保存原始 DisplayMode進入前保存 gd.getDisplayMode(),退出時恢復
Mac 上全屏行為異常macOS 有獨立全屏機制使用 JFrame + setExtendedState(MAXIMIZED_BOTH) 替代

最佳實踐清單

  1. 啟用前檢查 isFullScreenSupported()
  2. 使用 JWindow 或 undecorated JFrame
  3. 提供明確退出方式(Esc 鍵、點擊、菜單)
  4. 保存並恢復原始 DisplayMode
  5. 在 paint() 中繪製,或使用 BufferStrategy 雙緩衝渲染
  6. 全屏期間禁用屏保/休眠(需 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、窗口生命週期管理、顯示模式切換與渲染策略,可構建專業級全屏應用(遊戲、數字標牌、演示系統等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved