java是否可以重新加载相同的FXML/Controller实例?
目标:实现标准的“设置”GUI窗口。左侧ListView
中的类别和右侧Pane
中的相应选项。
(请忽略重复分类的明显错误;仍在处理中)
我有一个总体设置窗口的主窗口,其中包含一个包含所有设置类别的ListView
。窗口的右侧有一个AnchorPane
,当从列表中选择一个类别时,它用于为每个类别加载单独的FXML文件
当用户选择一个类别时,我需要他们能够编辑右侧的设置,切换到另一个类别并进行更多更改。然而,如果他们回到第一类,那里发生的变化就会持续下去
我的明显问题是,每次用户更改类别时,FXMLLoader
都会重新加载FXML文件和控制器,将其中的所有控件重置为其默认值
那么,是否有可能重用已经加载和修改过的FXML文件呢
研究:
我发现唯一能解决这个问题的答案是How to swich javafx application controller without reloading FXML file?。这提到了对FXML控制器使用单例,但没有解决每次重新加载FXML文件本身的问题
如果有人能指出这种设置菜单的一个基本例子,我会很高兴
# 1 楼答案
这里是一个完全不同的方法来创建一个“导航窗格”,就像你展示的那个,部分灵感来自Hypnic Jerk的答案。这里的关键观察是,您想要的功能基本上与
TabPane
相同:您有一系列节点,一次显示一个,并有一个机制来选择显示哪一个(通常是选项卡,但这里有一个ListView
)。因此,这种方法只是让选项卡窗格使用ListView
而不是通常的选项卡来显示“选择器”。它通过为选项卡窗格创建一个新的Skin
来实现这一点以下是基本应用程序:
此测试的控制器不执行任何操作:
各个窗格只是占位符:
application类只加载FXML,关键是设置一个样式表:
样式表指定了皮肤:
最后是起作用的部分:皮肤:
这将创建一个
ListView
,并对侦听器和绑定进行一些处理,以确保它始终与选项卡窗格中的选项卡列表具有相同的内容,并且列表视图中的选定项就是选定选项卡。(如果以编程方式更改了选定选项卡,则需要确保列表视图会更新,如果用户更改了列表视图中的选定项,则需要确保选定选项卡会更改。)其余的只覆盖layoutChildren()
方法和计算最小/最大/预大小的各种方法结果是一个传统的“导航窗格”:
当然,由于所有选项卡内容都只加载一次,并且只是在视图中切换和切换(通过更改其可见性),因此恢复到上一个视图时丢失数据的问题消失了