我正在使用kotlin和tornadofx来创建一些小型应用程序,但是我不熟悉某些Javafx东西如何转换为kotlin。
我试图遍历按钮列表,并在页面上添加按钮,但是我只设法每页添加一个按钮,并且我希望每页有X个项目,并且我希望页面计数是动态的< / p>
override val root = tabpane{
setPrefSize(800.0,600.0)
tabs.removeAll()
tabClosingPolicy = TabPane.TabClosingPolicy.ALL_TABS
val buttonList = arrayOf(
Button("Btn1"),
Button("Btn2"),
Button("Btn3"),
Button("Btn4")
)
tab("My Tab 1") {
hbox {
button("Click Me!") {
setOnAction {
replaceWith<TestView>()
}
}
button("Add Tab 2") {
setOnAction {
tab("tab2 ")
{
select()
button("Close") { setOnAction { close() } }
pagination(buttonList.size) { setPageFactory { pageIndex -> (buttonList[pageIndex]) } }
style {
arrowsVisible = false
pageInformationVisible = false
}
}
}
}
}
}
}
我尝试实现一个for循环,该循环将在每页中添加一定数量的项目(每页说2个按钮),然后继续创建页面。但我没有运气。
如果有人可以帮助我找到基于Kotlin的分页的正确解决方案,我将不胜感激
pagination(buttonList.size)
通过这一行,我可以控制页面的数量,所以至少可以,但是我看不到如何控制每页的数量。
pageIndex -> (buttonList[pageIndex])
我意识到问题出在这里,但是我没有实现正确逻辑的运气。
让我说我希望每页4个项目,我可以通过将列表除以数字4(每页项目)来获得所需的页面数量。但不确定如何在每页中添加超过1个项目。
答案 0 :(得分:0)
class SomeView : View() {
private val buttonList = arrayOf(
Button("Btn1"),
Button("Btn2"),
Button("Btn3"),
Button("Btn4"),
Button("Btn5")
)
private var pageSize = 3 //Decide this however you want
override val root = tabpane {
setPrefSize(800.0, 600.0)
tabs.removeAll()
tabClosingPolicy = TabPane.TabClosingPolicy.ALL_TABS
tab("My Tab 1") {
hbox {
button("Click Me!") {
setOnAction {
replaceWith<TestView>()
}
}
button("Add Tab 2") {
setOnAction {
tab("tab2 ")
{
select()
button("Close") { setOnAction { close() } }
//The ceiling calc is for rounding up for the size
pagination(ceil(buttonList.size.toDouble() / pageSize).toInt())
{ setPageFactory { pageIndex -> createPage(pageIndex * pageSize, pageSize) } }
style {
arrowsVisible = false
pageInformationVisible = false
}
}
}
}
}
}
}
private fun createPage(startingIndex: Int, pageSize: Int = 1) : Pane {
val pagePane = VBox() //Create and design whatever pane you want
val endingIndex = minOf(startingIndex + pageSize, buttonList.size) //Don't go out of bounds
for(i in startingIndex until endingIndex) { //Assuming starting index is in bounds
pagePane.add(buttonList[i])
}
return pagePane
}
}
这是动态页面分页的解决方案。您的主要问题是选项卡窗格仅包含一个子窗格/组件。答案是将按钮嵌套在窗格中。我没有针对边缘情况或其他方面进行过艰苦的测试,因此这更是概念验证。如果它们出现,则必须考虑这些。
侧面说明:如上所述,这也是为什么未显示“关闭”按钮的原因。另外,当我测试您的代码时,我注意到除非单击窗格中的按钮,否则样式不会实现。如果您使用样式表,创建了一个cssclass并将该类添加到选项卡窗格中,则可能会起作用(如果选择这样做,请不要忘记导入样式表)。