(JavaFX)SplitPane.getDividerPositions()不一致

时间:2016-08-15 14:28:21

标签: javafx splitpane

我的主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.

2 个答案:

答案 0 :(得分:1)

来自Javadocs for SplitPane

  

分频器的位置范围从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方法在应用程序启动时设置分隔符位置。 (由于应用程序启动和初始化的方式,这种技术是必要的)