1

我的SplitPane主 GUI 中有一个行为异常。我试图保存程序执行之间的位置,并通过写入/读取一个简单的文本文件来做到这一点。

但是,我注意到该getPosition()方法在将其保存到文件时返回了不正确的值。

退出程序时,我正在使用以下代码保存位置:

Settings.setSplitPaneLocation(Global.commentMasterController.getSplitPane().getDividers().get(0).getPosition());
  • Global是一个单例,它包含对我的主要 GUI 控制器的引用。
  • Settings是另一个包含从设置文件加载的值的单例。

加载程序后,我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。

4

2 回答 2

1

来自Javadocs 的SplitPane

分隔符的位置范围从 0 到 1.0(含)。位置 0 会将分隔线放置在 SplitPane 的最左/最上边缘加上节点的最小大小。位置 1.0 会将分隔线放置在SplitPane减节点最小大小的最右/最底部边缘。分隔线位置 0.5 会将分隔线放在SplitPane. 将分隔线位置设置为大于节点的最大尺寸位置将导致分隔线设置在节点的最大尺寸位置。将分隔线位置设置为小于节点的最小尺寸位置将导致分隔线设置在节点的最小尺寸位置。因此,在setDividerPosition(int, double)和 中设置的值setDividerPositions(double...)可能与返回的值不同getDividerPositions()

(我的重点。)在不了解您在做什么的情况下,很难准确了解您正在观察的行为,但我怀疑您设置的值正在调整以考虑内容的最小/最大大小节点。

于 2016-08-15T14:41:11.310 回答
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 方法设置分隔线位置。(由于应用程序的启动和初始化方式,此技术是必要的)

于 2018-05-05T14:23:10.037 回答