我的主GUI中有SplitPane
表现奇怪。我试图保存程序执行之间的位置,并通过编写/读取一个简单的文本文件来实现。
但是,我注意到getPosition()
方法在将其保存到文件时返回的值不正确。
退出程序时,我使用以下代码保存位置:
Settings.setSplitPaneLocation(Global.commentMasterController.getSplitPane().getDividers().get(0).getPosition());
Global
是一个Singleton,它保存对我的主GUI控制器的引用。Settings
是另一个包含从设置文件加载的值的Singleton。加载程序后,我通过加载SplitPane
类中最后保存的值来设置Settings
的位置:
splitPane.setDividerPosition(0, Settings.getSplitPaneLocation());
问题是,当我加载程序时,即使我根本不调整SplitPane
位置(加载程序并立即退出),保存的位置也不同于它的位置最初设置为。
这是输出,显示程序连续3次运行。再一次,这只是运行程序并立即退出;我根本不调整任何控件的位置:
setDividerPosition(): 0.9247730220492867
getDividerPosition(): 0.9105058365758755
setDividerPosition(): 0.9105058365758755
getDividerPosition(): 0.893644617380026
setDividerPosition(): 0.893644617380026
getDividerPosition(): 0.874189364461738
如您所见,getDividerPosition()
返回的值与分隔符的实际位置不同。
我检查了SplitPane
中子节点的最大/最小尺寸,最小尺寸设置为0.
答案 0 :(得分:1)
分频器的位置范围从0到1.0(含)。位置0 将分隔符放在SplitPane plus的左/最顶边 节点的最小大小。 1.0的位置将放置分隔线 在
SplitPane
的最右边/最底边减去最小值 节点的大小。分频器位置0.5将放置分频器 在SplitPane
的中间。将分隔位置设置得更大 比节点的最大尺寸位置将导致分隔符 设置在节点的最大大小位置。设置分隔位置 小于节点的最小尺寸位置将导致分隔符 被设置在节点的最小尺寸位置。 因此价值 在setDividerPosition(int, double)
中设置setDividerPositions(double...)
可能与值不同 由getDividerPositions()
返回。
(我的重点。)在不了解您正在做什么的情况下,很难准确了解您正在观察的行为,但我怀疑您正在设置的值正在调整以考虑最小/最大尺寸内容节点。
答案 1 :(得分:0)
我遇到了类似的问题并发现这篇文章没有真正的解决方案,所以也许它可以帮助将来的某个人:
尝试使用Platform.runLater()
。显然,当您启动应用程序并希望同时更改GUI元素时会发生冲突。
对于您的具体问题,它将是:
Platform.runLater(() -> splitPane.setDividerPosition(0, Settings.getSplitPaneLocation()));
我在以下博文中找到了这个提示:http://broadlyapplicable.blogspot.de/2015/03/javafx-capture-restore-splitpane.html
如何使用javafx.application.Platform.runLater方法在应用程序启动时设置分隔符位置。 (由于应用程序启动和初始化的方式,这种技术是必要的)