You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaFX/FXML中实现MediaView单独全屏?

解决MediaView单独全屏而非整个窗口全屏的问题

嘿,我懂你现在的困扰——本来想让MediaView单独进入全屏模式播放视频,结果整个应用窗口都跟着全屏了,完全不是想要的效果。别着急,咱们来搞定这个问题。

问题根源

你之前应该是直接调用了Stage的setFullScreen(true)方法吧?这个方法是针对整个应用窗口的,所以才会导致整个窗口全屏。要实现MediaView单独全屏,咱们需要把MediaView从当前布局中临时移出来,放到一个独立的全屏Stage里,或者在当前窗口内动态调整布局让它覆盖整个屏幕。

方案一:用独立Stage承载MediaView(推荐)

这个方法最直观,就是把MediaView放到一个新的全屏Stage中播放,退出全屏时再放回原来的布局。以下是完整的代码示例,你可以直接整合到你的项目里:

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.geometry.Rectangle2D;
import javafx.stage.Screen;

@FXML private MediaPlayer mediaPlayer;
@FXML private MediaView mediaView;
@FXML private Label label;
@FXML private String filepath;

// 保存MediaView原来的父容器和布局约束,用于退出全屏时恢复
private Pane originalParent;
private boolean isMediaFullScreen = false;

@FXML private void toggleMediaFullScreen(ActionEvent event) {
    if (!isMediaFullScreen) {
        // 进入MediaView单独全屏
        originalParent = (Pane) mediaView.getParent();
        originalParent.getChildren().remove(mediaView);

        // 创建新的全屏Stage
        Stage fullScreenStage = new Stage();
        fullScreenStage.setFullScreen(true);
        fullScreenStage.setFullScreenExitHint("按ESC退出全屏");

        // 将MediaView放到新Stage的Scene中
        Scene fullScreenScene = new Scene(mediaView);
        fullScreenStage.setScene(fullScreenScene);

        // 监听全屏退出事件,恢复MediaView到原布局
        fullScreenStage.fullScreenProperty().addListener((obs, oldVal, newVal) -> {
            if (!newVal) {
                originalParent.getChildren().add(mediaView);
                isMediaFullScreen = false;
            }
        });

        fullScreenStage.show();
        isMediaFullScreen = true;
    }
}

方案二:在当前窗口内动态调整布局

如果你不想新建Stage,也可以在当前窗口内隐藏其他控件,让MediaView占满整个屏幕:

@FXML private void toggleMediaFullScreen(ActionEvent event) {
    Stage currentStage = (Stage) mediaView.getScene().getWindow();
    if (!isMediaFullScreen) {
        // 隐藏其他控件
        label.setVisible(false);
        // 让MediaView占满整个窗口
        mediaView.fitWidthProperty().bind(currentStage.widthProperty());
        mediaView.fitHeightProperty().bind(currentStage.heightProperty());
        // 窗口进入全屏
        currentStage.setFullScreen(true);
        isMediaFullScreen = true;
    } else {
        // 退出全屏,恢复控件显示和MediaView布局
        currentStage.setFullScreen(false);
        mediaView.fitWidthProperty().unbind();
        mediaView.fitHeightProperty().unbind();
        // 这里可以恢复MediaView原来的大小,比如设置固定值或者绑定原布局约束
        mediaView.setFitWidth(640);
        mediaView.setFitHeight(360);
        label.setVisible(true);
        isMediaFullScreen = false;
    }
}

注意事项

  • 方案一中,记得在退出全屏时把MediaView放回原来的父容器,否则下次播放会出问题。
  • 方案二中,如果你的MediaView是放在特定布局容器(比如AnchorPane)里的,退出全屏时可以重新绑定它的布局约束,而不是设置固定大小,这样更灵活。
  • 可以给全屏按钮添加图标或者提示,让用户知道怎么操作。

内容的提问来源于stack exchange,提问作者sarra el filali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:56