Как можно создать TableView с динамическим столбцом над пользовательским типом данных в Kotlin? - PullRequest
0 голосов
/ 27 июня 2019

Я мог бы генерировать TableView, когда столбцы исправлены перед компиляцией.Однако я не смог создать TableView, когда количество столбцов не фиксировано до запуска экземпляра.

  • Размер unitArray может варьироваться в каждом экземпляре
  • Every VariableData в экземпляре имеют такой же размер unitArray
  • Я не могу преобразовать и отобразить все данные как String, потому что мне нужно сделать что-то большее с пользовательским интерфейсом и его типами.(Сортировка по Enum с произвольным порядком и т. Д.)

main.kt

package tDynamicTable

import javafx.application.Application
import javafx.collections.FXCollections
import javafx.fxml.FXMLLoader
import javafx.scene.*
import javafx.scene.control.*
import javafx.scene.control.cell.*
import javafx.scene.layout.*
import javafx.stage.*


fun main(args : Array<String>) {
    println("Dynamic Columns by data")

    Application.launch(DynamicTable().javaClass, *args)

}

class DynamicTable : Application() {

    override fun start(primaryStage: Stage) {
        primaryStage.title = "Dynamic Table"
        primaryStage.isAlwaysOnTop = true
        val fxml = javaClass.getResource("/fxml/VBox.fxml")
        val root: Parent = FXMLLoader.load(fxml)
        val scene = Scene(root)
        val vBox = root.lookup("#VBox") as VBox

        val tableView: TableView<VariableData> = TableView()
        val colStatus: TableColumn<VariableData,Boolean> = TableColumn()
        val colName: TableColumn<VariableData,String> = TableColumn()

        // Should load data here - size of `unitArray` is not defined before here
        var aList= FXCollections.observableArrayList<VariableData>()
        // Every elements in aList have same size of unitArray
        aList.add(a)
        aList.add(b)
        aList.add(c)

        var colSize = aList[0].unitArray.size

        colStatus.text = "Status"
        colStatus.cellValueFactory = PropertyValueFactory("status")
        colName.text = "Name"
        colName.cellValueFactory = PropertyValueFactory("name")

        tableView.columns.add(colStatus)
        tableView.columns.add(colName)

        for (i in 1..colSize) {
            // I may have to do something here
            // tableView.columns.add(TableColumn())
        }

        tableView.items = aList

        vBox.children.addAll(tableView)
        primaryStage.scene = scene
        primaryStage.show()
    }
}

class VariableData (
    val status: Boolean,
    val name: String,
    val unitArray: Array<UnitData>
)

class UnitData (
    val type: FileType,
    val path: String
)

enum class FileType { ARCHIVE, FILE, UNKNOWN }
fun FileType.toString() = when (this) {
    FileType.ARCHIVE -> "A"
    FileType.FILE -> "F"
    FileType.UNKNOWN -> "U"
}

val a = VariableData(true, "A",
    arrayOf(
        UnitData(FileType.ARCHIVE, "a.zip"),
        UnitData(FileType.FILE,"a.txt")))
val b = VariableData(true, "B",
    arrayOf(
        UnitData(FileType.ARCHIVE, "b.zip"),
        UnitData(FileType.FILE,"b.txt")))
val c = VariableData(true, "C",
    arrayOf(
        UnitData(FileType.UNKNOWN, "c.exe"),
        UnitData(FileType.FILE,"c.txt")))

resource / fxml / VBox.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.VBox?>


<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400" prefWidth="800" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <VBox fx:id="VBox" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" />
    </children>
</AnchorPane>

Я пыталсяследовать JavaFX TableView динамические столбцы и значения данных и Как добавить динамические столбцы и строки в TableView в java fxml , но это может не работать с пользовательскими данными, но только для строковых данных.

...