Kotlin撰写桌面窗口的问题



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

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

我有以下主要和我的问题是,如果我取消评论并运行类内的game()方法,它不会启动应用程序窗口,如果我尝试取消评论相同的方法,但从窗口外,它仍然不会启动桌面应用程序。另一方面,如果我运行它,它将启动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])
}
}
}

我刚开始写作,我不知道是什么问题,特别是因为我试图在窗口外运行方法

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

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

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

fun() main = application {
resetBoard()
printBoardSmall()
Window( ... ){
ui()
}
Thread {
game()
}.start()
}

注:我对作曲也很陌生。对编程有点陌生。真的,真的很抱歉我做了所有的过度简化。

P.P.S.你可以添加一个TextField到你的应用程序,并使用Button的onClick参数调用移动检查函数。这样就不需要玩线程和协程了。你也可以为棋盘方块使用button,因为你可以给它们分配背景和图像。如果你需要任何帮助- HMU.

最新更新