Я пытаюсь изучить Kotlin и TornadoFX, и я работаю с из этого репозитория
В настоящее время идея состоит в том, что приложение будет отображать три ряда по 7 кнопок. Каждая кнопка представляет букву, которая известна или неизвестна. Если буква известна, она отображается на кнопке. Если буква неизвестна, на кнопке отображается индекс (0-20).
Я сделал это, создав (с уверенностью думая о Java) глобальный массив с 21 элементом. Каждый элемент начинается с нуля. Я определил это в основном приложении, используя конструкцию компаньона:
class InteractiveClientApp : App(MainView::class) {
companion object {
var knownLetters = arrayOfNulls<String>(21)
}
Затем в конструкторе приложения я инициализировал несколько случайных элементов со значениями, просто чтобы посмотреть, будет ли это работать (не работает).
override fun init() {
knownLetters[4] = "T"
knownLetters[9] = "G"
knownLetters[17] = "Z"
}
Затем в LettersGridView я использую forEachIndexed для массива knownLetters, чтобы у меня был доступ к элементу из массива и индексу для него.
import jcn.deduce.client.InteractiveClientApp.Companion.knownLetters
class LettersGridView : View() {
override val root = gridpane {
knownLetters.forEachIndexed { index, element ->
if (index == 0 || index % 7 == 0) {
row {
button(element?.toString() ?: index.toString()) {
useMaxWidth = true
gridpaneConstraints {
marginBottom = 10.0
}
}
}
} else {
button(element?.toString() ?: index.toString()) {
useMaxWidth = true
gridpaneConstraints {
marginBottom = 10.0
}
}
}
}
}
}
В действительности происходит то, что вместо ожидаемой 21 появляются три кнопки, а значение на кнопке всегда является индексом, а не буквенным значением. Также показаны индексы 20, 7 и 14. Не три, которые я использовал при настройке элементов в массиве. Так что я что-то там упускаю.
Также я думаю, что не совсем правильно понял этот бит:
button(element?.toString() ?: index.toString()) {
useMaxWidth = true
gridpaneConstraints {
marginBottom = 10.0
}
}
То, что я пытаюсь сказать, есть: «Если значение элемента не равно нулю, используйте значение элемента, в противном случае используйте строковое значение индекса. Это не работает, потому что кнопки имеют только индексы на них, никогда буквы.
Я замечаю, что если я отключу элемент .toString () для элемента, я получаю сообщение об ошибке, что кнопка ожидает строку, а не строку ?. Что похоже на Java и String vs Optional . Однако когда я добавляю toString (), я получаю предупреждение IDE о том, что toString () является избыточным.
Если я сниму трейлинг? В целом, я получаю чистую компиляцию, но все равно отображаются только три кнопки, и их метки являются индексными, а не элементными.
Так что я почти уверен, что где-то заблудился, может кто-нибудь объяснить, почему моя программа не работает?
Кроме того, когда я отлаживаю приложение, я всегда сталкиваюсь с двумя процессами. Я не понимаю почему, но вот как выглядит IntelliJ:
Это нормально?