Я мог бы генерировать 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 , но это может не работать с пользовательскими данными, но только для строковых данных.