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

问题:JavaFX主窗口最大化后无法显示全部子窗口

解决JavaFX最大化主窗口恢复后部分UTILITY子窗口隐藏的问题

我刚复现了你的问题——当主窗口处于最大化状态下最小化再恢复时,确实只有一个StageStyle.UTILITY样式的子窗口能被唤起,另一个会离奇消失。这个问题源于JavaFX对UTILITY窗口与最大化主窗口的关联处理逻辑,但我们可以通过监听主窗口的显示状态变化来手动修复。

问题根源

当主窗口从最小化状态恢复时,JavaFX只会自动触发一个关联的UTILITY子窗口重新显示,剩下的子窗口不会被系统自动唤起,需要我们手动干预。

解决方案

给主窗口添加一个showingProperty监听器,当主窗口重新显示时,遍历所有关联的子窗口,确保它们都能正常显示并前置。注意不能重复调用show()(会抛出异常),所以先判断窗口状态,再用toFront()确保窗口可见。

修改后的完整代码

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class LotsaStages extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("JavaFX App");
        primaryStage.setMaximized(true);

        // 创建两个UTILITY子窗口并关联主窗口
        Stage stage = new Stage(StageStyle.UTILITY);
        stage.initOwner(primaryStage);
        stage.setTitle("Utility Window 1");

        Stage stage2 = new Stage(StageStyle.UTILITY);
        stage2.initOwner(primaryStage);
        stage2.setTitle("Utility Window 2");

        // 监听主窗口显示状态变化,恢复时处理子窗口
        primaryStage.showingProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue) { // 当主窗口重新显示时
                // 获取主窗口所有关联的Stage类型子窗口
                ObservableList<Stage> childStages = primaryStage.getOwnedWindows()
                        .filter(window -> window instanceof Stage)
                        .map(window -> (Stage) window)
                        .collect(javafx.collections.FXCollections::observableArrayList, ObservableList::add, ObservableList::addAll);
                
                // 确保每个子窗口都显示并前置
                childStages.forEach(childStage -> {
                    if (!childStage.isShowing()) {
                        childStage.show();
                    }
                    childStage.toFront();
                });
            }
        });

        primaryStage.show();
        stage.show();
        stage2.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关键修改说明

  • 监听主窗口状态:通过showingProperty捕捉主窗口从隐藏到显示的切换事件
  • 获取子窗口列表:用getOwnedWindows()获取所有关联的子窗口,过滤出Stage类型
  • 子窗口状态处理:先判断子窗口是否已显示,未显示则调用show(),再用toFront()确保窗口出现在最上层,避免被其他窗口遮挡

这个方案既保留了你需要的StageStyle.UTILITY单图标特性,又完美解决了最大化主窗口恢复后子窗口丢失的问题。

内容的提问来源于stack exchange,提问作者Gustavo Minhaneli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:34:59