Jetpack Compose Desktop 有没有办法向窗口添加高度?如何设置窗口的最小尺寸?

Mar*_*il4 1 kotlin-multiplatform android-jetpack-compose

我在浏览 compose 桌面教程时遇到问题。

我有两个关于撰写桌面基础知识的问题。

首先,有没有办法为整个窗户添加标高?

其次,有没有办法设置窗口的最小尺寸? 当我单击窗口边缘时,即使没有显示任何箭头,也可以调整窗口大小,但我找不到对其最小尺寸添加约束的方法。它会闪烁直至消失。

我当前的预览如下所示。

在此输入图像描述

我的代码看起来像这样。

fun main() = application {

val windowState = rememberWindowState()
windowState.size = WindowSize(392.dp, 642.dp)

var isVisible by remember { mutableStateOf(true) }

val trayState = rememberTrayState()

Tray(
    state = trayState,
    icon = TrayIcon,
    hint = "PickMessengerV2",
    onAction = {
        isVisible = true
    },
    menu = {
        Item(
            "Exit",
            onClick = {
                exitApplication()
            }
        )
    }
)

Window(
    onCloseRequest = {
        isVisible = false
    },
    state = windowState,
    undecorated = true,
    resizable = true,
    visible = isVisible
) {


    AppTheme(darkTheme = false) {
        Row(modifier = Modifier.fillMaxSize()) {
            var menuIdx by remember {
                mutableStateOf(value = 0)
            }
            WindowDraggableArea {
                Column(
                    modifier = Modifier.width(67.dp).fillMaxHeight().background(Color(0xFFf3f5f6)),
                    horizontalAlignment = Alignment.CenterHorizontally
                ) {

                    val onClick: (Int) -> Unit = { myIndex ->
                        menuIdx = myIndex
                    }

                    mainMenu(
                        menuIdx,
                        0,
                        listOf("LeftMenu_friend_ON.png", "LeftMenu_friend_OFF.png"),
                        marginTop = 36,
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        1,
                        listOf("LeftMenu_ Orga_ON.png", "LeftMenu_ Orga_OFF.png"),
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        2,
                        listOf("LeftMenu_chat_ON.png", "LeftMenu_chat_OFF.png"),
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        3,
                        listOf("LeftMenu_letter_OFF_2.png", "LeftMenu_letter_OFF.png"),
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        4,
                        listOf("LeftMenu_file_ON.png", "LeftMenu_file_OFF.png"),
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        5,
                        listOf("LeftMenu_ Coop_ON.png", "LeftMenu_ Coop_OFF.png"),
                        onClick = onClick
                    )
                    mainMenu(
                        menuIdx,
                        6,
                        listOf("LeftMenu_bnad_ON.png", "LeftMenu_band_OFF.png"),
                        onClick = onClick
                    )
                }
            }

            Column(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background)) {

                WindowDraggableArea{
                    Row(
                        modifier = Modifier.fillMaxWidth().height(31.dp),
                        verticalAlignment = Alignment.CenterVertically
                    ) {
                        Spacer(modifier = Modifier.weight(1f))
                        Box(modifier = Modifier.fillMaxHeight().clickable {
                            windowState.isMinimized = true
                        }.padding(start = 6.dp, end = 6.dp), contentAlignment = Alignment.Center) {
                            NsImage("win_1.png")
                        }
                        Box(modifier = Modifier.fillMaxHeight().clickable {
                            windowState.placement = if(windowState.placement == WindowPlacement.Fullscreen){
                                WindowPlacement.Floating
                            }else {
                                WindowPlacement.Fullscreen
                            }
                        }.padding(start = 6.dp, end = 6.dp), contentAlignment = Alignment.Center) {
                            NsImage("win_2.png")
                        }
                        Box(modifier = Modifier.fillMaxHeight().clickable {
                            isVisible = false
                        }.padding(start = 6.dp, end = 6.dp), contentAlignment = Alignment.Center) {
                            NsImage("win_3.png")
                        }
                        Spacer(modifier = Modifier.width(6.dp))
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

小智 6

这是最小窗口大小的解决方案:您需要通过 FrameWindowScope 访问 AWT API

    fun FrameWindowScope.setMinSize() {
        window.minimumSize = Dimension(yourMinWidth, yourMinHeight)
    }
Run Code Online (Sandbox Code Playgroud)

然后您只需在 Window 函数中调用 setMinSize() 即可。