桌面版 Kotlin compose 的问题 Window

Problem with Kotlin compose for desktop Window

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

我提到的 game() 方法是一个简单的 while 循环,它允许我以代数符号请求移动并在有效的情况下执行移动。

我有以下主要内容,我的问题是,如果我取消注释并 运行 classe 中的 game() 方法,它不会启动 App window,如果我改为尝试取消注释同样的方法,但在 Window 之外,它仍然无法启动桌面应用程序。 另一方面,如果我 运行 它有它,它将启动 UI window.

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])
        }
    }
}

我是写作新手,我不知道是什么问题,特别是因为我试图 运行 Window

之外的方法

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

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

您应该尝试将 game() 放在单独的线程中。这样的事情应该有效:

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

    Window( ... ){
        ui()
    }

    Thread {
       game()
    }.start()
}

P.S。我对作曲也很陌生。对编程有点陌生。对于我所做的所有过度简化,真的非常抱歉。

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