首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置SplitPane的分隔符位置

设置SplitPane的分隔符位置
EN

Stack Overflow用户
提问于 2016-03-30 00:58:44
回答 7查看 13.8K关注 0票数 11

我想要将SplitPane的分隔符设置为某个默认位置。这不起作用,分隔符留在中间:

代码语言:javascript
复制
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();
}

输出:

代码语言:javascript
复制
0.8
0.5

这表明有什么东西把它重置到了中间。

我如何才能做到这一点?

EN

回答 7

Stack Overflow用户

发布于 2016-03-30 02:39:07

问题似乎是在最大化Stage期间设置SplitPane宽度时,分隔器位置被重置。之后通过监听窗口的showing属性来设置分隔符的位置,如下所示:

代码语言:javascript
复制
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);
        }
    }
});
票数 13
EN

Stack Overflow用户

发布于 2017-05-31 20:10:21

我遇到了同样的问题,上面的解决方案对我来说并不可靠。因此,我为SplitPane创建了一个自定义皮肤:

代码语言:javascript
复制
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));

票数 3
EN

Stack Overflow用户

发布于 2016-11-12 09:04:35

Stage初始化期间,窗口大小会多次更改,直到布局完成。每次更改都会修改分隔符的位置。如果您想控制分频器位置,则必须在Stage完全初始化后进行设置:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36290539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档