向页面添加更多项(分页javafx)

时间:2019-12-01 18:51:14

标签: javafx kotlin tornadofx

我正在使用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个项目。

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并将该类添加到选项卡窗格中,则可能会起作用(如果选择这样做,请不要忘记导入样式表)。