Java窗口全屏的基础概念

在Java GUI开发中,窗口全屏通常指两种模式:一种是“最大化全屏”(Maximized Full Screen),即窗口占据整个屏幕但保留系统任务栏和边框;另一种是“无边框全屏”(True Full Screen),即窗口完全覆盖屏幕,隐藏所有系统界面元素(如任务栏、标题栏等),实现这两种模式的核心类分别来自Swing和JavaFX框架,理解它们的底层机制是灵活控制全屏状态的前提。
使用Swing实现窗口全屏
Swing是Java传统的GUI工具包,其JFrame类是创建窗口的核心组件,通过JFrame的方法,可以轻松实现最大化全屏和无边框全屏。
最大化全屏(保留系统边框)
最大化全屏只需调用JFrame的setExtendedState()方法,传入JFrame.MAXIMIZED_BOTH常量,即可让窗口填满整个屏幕(包括任务栏上方区域),但保留窗口的标题栏和边框。
import javax.swing.*;
public class MaximizedFrame {
public static void main(String[] args) {
JFrame frame = new JFrame("最大化全屏示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
// 设置窗口最大化
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
}
关键点:setExtendedState()仅控制窗口的扩展状态,不会修改窗口的装饰(如标题栏),适合需要保留系统控制按钮的场景。
无边框全屏(彻底隐藏系统元素)
若要实现真正的全屏(如游戏、视频播放等场景),需结合setUndecorated(true)和setExtendedState()方法。setUndecorated(true)会移除窗口的标题栏和边框,再配合最大化状态,即可达到完全覆盖屏幕的效果。
import javax.swing.*;
public class TrueFullScreenFrame {
public static void main(String[] args) {
JFrame frame = new JFrame("无边框全屏示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 先移除装饰,再最大化
frame.setUndecorated(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
}
注意:setUndecorated()需在窗口显示前调用,否则会抛出IllegalComponentStateException,无边框全屏后,窗口失去系统自带的关闭按钮,需手动添加退出逻辑(如监听键盘事件)。

动态切换全屏状态
在实际应用中,常需要通过按钮或快捷键动态切换全屏状态,可通过监听事件,修改JFrame的extendedState和undecorated属性实现。
import javax.swing.*;
import java.awt.event.*;
public class ToggleFullScreen {
public static void main(String[] args) {
JFrame frame = new JFrame("动态全屏切换");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
JButton toggleBtn = new JButton("切换全屏");
toggleBtn.addActionListener(e -> {
boolean isFullScreen = frame.getExtendedState() == JFrame.MAXIMIZED_BOTH && frame.isUndecorated();
if (isFullScreen) {
// 退出全屏
frame.setUndecorated(false);
frame.setExtendedState(JFrame.NORMAL);
frame.setSize(600, 400);
} else {
// 进入全屏
frame.setUndecorated(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
});
frame.add(toggleBtn);
frame.setVisible(true);
}
}
逻辑说明:通过检查当前窗口状态判断是否处于全屏模式,然后反向设置属性,退出全屏时需恢复窗口原始大小(或设置为默认大小)。
使用GraphicsDevice实现彻底全屏
Swing的JFrame全屏本质上是“最大化”,若要实现类似游戏的全屏模式(直接接管屏幕显示),需使用GraphicsDevice类,该类表示图形硬件设备(如显示器),提供setFullScreenWindow()方法,可将窗口设置为设备的全屏模式。
基本实现步骤
- 获取默认
GraphicsDevice对象; - 创建
JFrame并设置窗口关闭属性; - 调用
device.setFullScreenWindow(frame)进入全屏; - 退出全屏时,将
setFullScreenWindow()参数设为null。
import javax.swing.*;
import java.awt.*;
public class DeviceFullScreen {
public static void main(String[] args) {
JFrame frame = new JFrame("GraphicsDevice全屏示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JLabel("按ESC退出全屏", SwingConstants.CENTER));
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
// 检查设备是否支持全屏模式
if (device.isFullScreenSupported()) {
device.setFullScreenWindow(frame);
} else {
frame.setSize(800, 600);
frame.setVisible(true);
}
// 添加键盘监听,按ESC退出全屏
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
device.setFullScreenWindow(null);
frame.dispose();
}
}
});
frame.setFocusable(true);
frame.requestFocus();
}
}
关键点:GraphicsDevice全屏会隐藏所有系统界面元素,且窗口必须设置为“无焦点”(frame.setFocusable(true))才能接收键盘事件,需通过isFullScreenSupported()检查设备是否支持全屏模式,避免兼容性问题。
JavaFX中的全屏实现
JavaFX是Java的现代GUI框架,其Stage类提供了更简洁的全屏API,通过Stage的setFullScreen()方法,可轻松切换全屏状态,且支持“全屏退出提示”(如按ESC退出)。

基本示例
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class JavaFXFullScreen extends Application {
@Override
public void start(Stage stage) {
Label label = new Label("按ESC或点击全屏按钮切换全屏");
Scene scene = new Scene(label, 400, 300);
// 设置窗口标题
stage.setTitle("JavaFX全屏示例");
// 设置场景
stage.setScene(scene);
// 显示窗口
stage.show();
// 监听全屏状态变化
stage.fullScreenProperty().addListener((obs, oldVal, newVal) -> {
if (!newVal) {
System.out.println("退出全屏");
}
});
}
public static void main(String[] args) {
launch(args);
}
}
动态切换全屏:通过stage.setFullScreen(!stage.isFullScreen())实现全屏状态切换,JavaFX的全屏模式默认会隐藏窗口边框,且保留系统任务栏(取决于操作系统设置)。
无边框全屏
若要实现彻底的无边框全屏(类似GraphicsDevice效果),可结合setFullScreen(true)和initStyle(StageStyle.UNDECORATED):
stage.initStyle(StageStyle.UNDECORATED); // 移除窗口装饰 stage.setFullScreen(true); // 进入全屏
全屏场景的常见处理
- 退出全屏的交互:无边框全屏时,需提供明确的退出方式(如键盘快捷键ESC、按钮点击或手势),避免用户无法关闭窗口。
- 多显示器适配:使用
GraphicsDevice时,可通过GraphicsEnvironment.getScreenDevices()获取所有显示器,选择指定设备进入全屏。 - 全屏时的焦点管理:全屏窗口必须保持焦点才能接收输入事件,可通过
requestFocus()或setAlwaysOnTop(true)确保焦点不丢失。
全屏模式的注意事项
- 性能影响:全屏模式下,窗口会独占GPU资源,需避免频繁重绘或复杂布局,可能导致卡顿。
- 操作系统差异:macOS的全屏模式会创建独立桌面空间,而Windows则是直接覆盖屏幕;JavaFX的全屏行为在不同系统下可能略有差异。
- 资源释放:退出全屏时,需确保关闭窗口或释放资源(如
device.setFullScreenWindow(null)),避免内存泄漏。
通过以上方法,可根据实际需求选择合适的全屏实现方式,Swing适合传统桌面应用,GraphicsDevice适合游戏或沉浸式场景,JavaFX则提供了更现代的API,三者结合使用可满足不同场景的全屏需求。














