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

如何在Jetpack Compose Desktop中让设置窗口仅固定在主窗口前方?

Jetpack Compose Desktop 实现设置窗口仅在主窗口前方显示

要解决这个问题,核心是利用系统窗口的父子层级关系,把设置窗口设为主窗口的子窗口,这样系统会自动维护层级——设置窗口只会在主窗口上方,不会跑到其他程序窗口的前面。具体实现步骤如下:

关键修改点

  • 移除设置窗口的alwaysOnTop=true参数
  • 获取主窗口的原生AWT窗口实例,将其设为设置窗口的父窗口

修改后的代码示例

@Composable
private fun MainWindow(onExit: () -> Unit) {
    val mainWindowState = WindowState(size = DpSize(1000.dp, 1000.dp))
    val settingsWindowState = WindowState(size = DpSize(800.dp, 600.dp))
    // 存储主窗口的原生AWT窗口对象
    var mainAWTWindow: java.awt.Window? by remember { mutableStateOf(null) }

    key(mainWindowState) {
        Window(
            onCloseRequest = onExit,
            title = "main window title",
            state = mainWindowState
        ) {
            // 获取主窗口的原生AWT窗口实例
            mainAWTWindow = LocalWindow.current.window
            // 主窗口内容
            // other composables ...
        }
        
        mainAWTWindow?.let { parentWindow ->
            key(settingsWindowState) {    
                Window(
                    onCloseRequest = { /* 处理设置窗口关闭逻辑 */ },
                    title = "Settings title",
                    state = settingsWindowState,
                    visible = isVisible,  // 你的显示控制变量
                    // 将主窗口设为设置窗口的父窗口
                    parentWindow = parentWindow
                ) {
                    // 设置窗口内容
                    // other composables ...
                }
            }
        }
    }
}

原理说明

当设置窗口成为主窗口的子窗口后:

  • 主窗口在前台时,设置窗口始终位于主窗口上方,不会被主窗口覆盖
  • 当其他程序窗口切换到前台时,主窗口和设置窗口都会被覆盖,不会干扰其他程序使用
  • 子窗口会自动跟随父窗口的最小化、移动等操作,符合用户预期的窗口行为

注意事项

  • 该方案同时兼容Mac和Windows平台,因为Compose Desktop的窗口底层基于AWT/Swing,父子窗口层级是跨平台支持的
  • 如果需要设置窗口可以独立于主窗口关闭,只需要正常处理onCloseRequest即可,不会影响层级关系

内容的提问来源于stack exchange,提问作者Alexander Fredheim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:35:20