【问题标题】:Problem with Kotlin compose for desktop WindowKotlin compose for desktop 窗口的问题
【发布时间】:2021-10-21 20:06:30
【问题描述】:

我正在尝试制作一个带有 ui 组件的国际象棋引擎桌面应用程序。

我提到的 game() 方法是一个简单的 while 循环,它允许我以代数表示法询问移动,如果移动是有效的,则进行移动。

我有以下主要内容,我的问题是,如果我取消注释并在类中运行 game() 方法,它将不会启动 App 窗口,如果我尝试取消注释相同的方法但从窗口外部它仍然不会启动桌面应用程序。 另一方面,如果我运行它,它将启动 UI 窗口。

fun main() = application {
    resetBoard()
    printBoardSmall()
    Window(onCloseRequest = ::exitApplication, icon = painterResource("black_knight.png"), title = "Chess") {
        ui()
        //game()
    }
    //game()
}
@Composable
fun ui() {
    var squarePair = false
    Row {
        Column {
            for (n in 8 downTo 1) {
                Row {
                    Text(
                        "" + n,
                        textAlign = TextAlign.Center,
                        modifier = Modifier.width(SIZE_TILE),
                        fontSize = FONT_SIZE_BOARD,
                        fontWeight = FontWeight.Bold
                    )
                    squarePair = boardLines(n, squarePair)
                }
            }
            Row {
                Text(" ", textAlign = TextAlign.Center, modifier = Modifier.width(SIZE_TILE))
                for (n in 0..7) {
                    Text(
                        "" + ('A' + n),
                        textAlign = TextAlign.Center,
                        modifier = Modifier.width(SIZE_TILE),
                        fontSize = FONT_SIZE_BOARD,
                        fontWeight = FontWeight.Bold
                    )
                }
            }
        }
        Column {
            Text("   Play", textAlign = TextAlign.Center, fontSize = 30.sp)
            var move = ""
            //var move by remember { mutableStateOf("") }
            TextField(
                value = move,
                onValueChange = { move = it },
                label = { Text("Move") },
                maxLines = 1,
                textStyle = TextStyle(color = Color.Black, fontWeight = FontWeight.Bold),
                modifier = Modifier.padding(20.dp)
            )
            print(move)
        }
    }
}

@Composable
fun board(n: Int, i: Int){
    var team = ""
    if(utils.isWhite(BOARD[n-1][i-1])) team = TEAM[0]
    if(utils.isBlack(BOARD[n-1][i-1])) team = TEAM[1]

    for(k in LOWER_CASE_LETTERS.indices) {
        if (BOARD[n-1][i-1] == LOWER_CASE_LETTERS[k] || BOARD[n-1][i-1] == UPPER_CASE_LETTERS[k]) {
            Image(painter = painterResource(team + "_" + PIECES[k] + ".png"), contentDescription = PIECES[k])
        }
    }
}

我是新手,我不知道问题出在哪里,特别是因为我试图在窗口外运行该方法

【问题讨论】:

  • 如果您在可组合项中运行循环,则这些可组合项在循环结束后完成。如果您需要单独运行的逻辑,请使用协程。

标签: kotlin desktop-application android-jetpack-compose desktop compose-desktop


【解决方案1】:

我不是专家,但我会尽力提供帮助。

  • 它不起作用,当你在窗口中调用它时,因为它是用来初始化它的布局的。所以窗口不会显示,直到game() 停止。
  • 我不知道,为什么它不工作,当你把它放在窗口之后。看着fun main() = application { ... }我怀疑,启动应用程序类似于启动窗口,所以它也不会启动,直到game()结束。

您应该尝试将game() 放在单独的线程中。像这样的东西应该可以工作:

fun() main = application {
    resetBoard()
    printBoardSmall()

    Window( ... ){
        ui()
    }

    Thread {
       game()
    }.start()
}

附:我对作曲也很陌生。对编程有点陌生。真的,真的很抱歉我所做的一切过于简单化。

附言您可以将 TextField 添加到您的应用程序并使用 Button 的 onClick 参数来调用移动检查功能。那时就不需要使用线程和协程了。您还可以将按钮用于棋盘方格,因为您可以为它们分配背景和图像。如果您需要任何帮助 - HMU。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多