我想要将SplitPane的分隔符设置为某个默认位置。这不起作用,分隔符留在中间:
public void start(Stage primaryStage) throws Exception{
SplitPane splitPane = new SplitPane(new Pane(), new Pane());
// Report changes to the divider position
splitPane.getDividers().get(0).positionProperty().addListener(
o -> System.out.println(splitPane.getDividerPositions()[0])
);
// Doesn't work:
splitPane.setDividerPositions(0.8);
// The docs seem to recommend the following (with floats instead of
// doubles, and with one number more than there are dividers, which is
// weird), but it doesn't work either:
//splitPane.setDividerPositions(0.8f, 0.2f);
primaryStage.setScene(new Scene(splitPane));
primaryStage.setMaximized(true);
primaryStage.show();
}输出:
0.8
0.5

这表明有什么东西把它重置到了中间。
我如何才能做到这一点?
发布于 2016-03-30 02:39:07
问题似乎是在最大化Stage期间设置SplitPane宽度时,分隔器位置被重置。之后通过监听窗口的showing属性来设置分隔符的位置,如下所示:
primaryStage.showingProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) {
splitPane.setDividerPositions(0.8);
observable.removeListener(this);
}
}
});发布于 2017-05-31 20:10:21
我遇到了同样的问题,上面的解决方案对我来说并不可靠。因此,我为SplitPane创建了一个自定义皮肤:
public class DumbSplitPaneSkin extends SplitPaneSkin {
public DumbSplitPaneSkin(SplitPane splitPane) {
super(splitPane);
}
@Override
protected void layoutChildren(double x, double y, double w, double h) {
double[] dividerPositions = getSkinnable().getDividerPositions();
super.layoutChildren(x, y, w, h);
getSkinnable().setDividerPositions(dividerPositions);
}
}这个皮肤可以通过css或者通过覆盖SplitPane.createDefaultSkin()来使用。也可以通过编程方式设置为splitPane.setSkin(新建DumbSplitPaneSkin(splitPane));
发布于 2016-11-12 09:04:35
在Stage初始化期间,窗口大小会多次更改,直到布局完成。每次更改都会修改分隔符的位置。如果您想控制分频器位置,则必须在Stage完全初始化后进行设置:
private boolean m_stageShowing = false;
@Override
public void start(Stage primaryStage) throws Exception {
SplitPane splitPane = new SplitPane(new Pane(), new Pane());
ChangeListener<Number> changeListener = new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
splitPane.setDividerPositions(0.8);
if (m_stageShowing) {
observable.removeListener(this);
}
}
};
splitPane.widthProperty().addListener(changeListener);
splitPane.heightProperty().addListener(changeListener);
primaryStage.setScene(new Scene(splitPane));
primaryStage.setMaximized(true);
primaryStage.show();
m_stageShowing = true;
}https://stackoverflow.com/questions/36290539
复制相似问题