【问题标题】:How to disable dragging of splitpane divider in JavaFX?如何在 JavaFX 中禁用拆分窗格分隔符的拖动?
【发布时间】:2015-06-30 05:58:07
【问题描述】:

我有一个拆分窗格,它分为 4 个不同的 AnchorPanes。所以有 3 个分隔线,我需要将分隔线设置为预定义的大小。我正在这样做,

leftSplitPane.setDividerPositions(0.04f, 0.4f, 0.86f);

但是在 UI 中,分隔线仍然是可拖动的。我需要禁止拖动这些分隔线。我在 SceneBuilder 中尝试了ResizableWithParent。但它不起作用。我也尝试过像这样将anchorpane绑定到splitpane,但是好像不对。

leftAnchorPane.maxWidthProperty().bind(leftSplitPane.widthProperty().multiply(1));

请帮帮我。

【问题讨论】:

  • 不想拖动分隔线,为什么要使用splitpane?
  • 我需要分离出 4 个组件。必须有一个分隔符来区分它们。
  • 您可以随时将它们添加到 GridPane 或其他适合您需要的布局中并显示边框。
  • @ItachiUchiha,我在 4 个组件中都有很多组件。将它们放入网格窗格中是一项有趣的任务

标签: javafx


【解决方案1】:

实现此目的的一种方法是在其更改侦听器上将分隔符位置设置为固定值:

final double pos[] =
{
    0.3f, 0.6f, 0.9f
};

sp.setDividerPositions( pos );

for ( int i = 0; i < sp.getDividers().size(); i++ )
{
    final int ind = i;
    SplitPane.Divider divider = sp.getDividers().get( i );
    divider.positionProperty().addListener(
            ( ObservableValue<? extends Number> observable, Number oldValue, Number newValue ) ->
            {
                divider.setPosition( pos[ind] );
            } );
}

隐式完整示例:

@Override
public void start( Stage primaryStage )
{
    SplitPane sp = new SplitPane();
    final StackPane sp1 = new StackPane();
    sp1.getChildren().add( new Button( "Button One" ) );
    final StackPane sp2 = new StackPane();
    sp2.getChildren().add( new Button( "Button Two" ) );
    final StackPane sp3 = new StackPane();
    sp3.getChildren().add( new Button( "Button Three" ) );
    sp.getItems().addAll( sp1, sp2, sp3 );

    final double pos[] =
    {
        0.04f, 0.4f, 0.86f
    };

    sp.setDividerPositions( pos );

    for ( int i = 0; i < sp.getDividers().size(); i++ )
    {
        final int ind = i;
        SplitPane.Divider divider = sp.getDividers().get( i );
        divider.positionProperty().addListener(new ChangeListener<Number>()
        {
            @Override
            public void changed( ObservableValue<? extends Number> observable, Number oldValue, Number newValue )
            {
                divider.setPosition( pos[ind] );
            }
        });
    }

    Scene scene = new Scene( sp, 400, 400 );
    primaryStage.setScene( scene );
    primaryStage.show();
}

【讨论】:

  • 它说“这个 lambda 表达式引用了缺少的类型 ObservableValue”
  • 语法错误。我只使用 JDK 1.8。我使用了像 event -> System.out.println() 这样的 lambda 表达式。那行得通
  • 这似乎是 Eclipse 的问题。 Netbeans 上没有这样的错误。你能把 lambda 转换成老式风格的代码,然后再试一次。
  • @NaveenBharadwaj,查看完整示例。
  • 我有锚窗格而不是堆栈窗格。有关系吗?因为你的例子有效。但我的应用程序中的相同代码没有
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2022-12-26
  • 2015-01-01
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多