如何在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
相关产品推荐
相关产品推荐

