JavaFx:禁用分隔符

9

我有一个使用JavaFX编写的应用程序,其中包含一个SplitPane。我想要禁用SplitPane上的Divider,这样在应用程序运行时就不可能改变其位置。我该如何做呢?

4个回答

9

这方面没有API可用,所以一旦场景显示出来,我们必须使用查找函数通过id找到节点。在这种情况下,Divider 的ID为:split-pane-divider

一旦我们找到节点,我们将其设置为不接受鼠标事件的透明状态:

@Override
public void start(Stage primaryStage) {
    final SplitPane splitPane = new SplitPane();
    splitPane.setOrientation(Orientation.HORIZONTAL);
    splitPane.setDividerPositions(new double[]{0.5});
    splitPane.getItems().add(new StackPane(new Label("Left")));
    splitPane.getItems().add(new StackPane(new Label("Right")));

    Scene scene = new Scene(splitPane, 300, 250);

    primaryStage.setScene(scene);
    primaryStage.show();

    splitPane.lookupAll(".split-pane-divider").stream()
            .forEach(div ->  div.setMouseTransparent(true) );

}

1
这很棒,但对于具有多个分割窗格的应用程序,所有窗格都将被禁用。如何设置分割窗格分隔符的ID? - chris
1
你只能在包含你想要禁用分隔条的预期splitPane中使用lookup - José Pereda
这还适用于JavaFX 8吗?我无法让它工作。没有找到任何节点。 - Manuel Mauky
确实还能用。您可以使用ScenicView查找分隔符,并查看它仍然使用相同的样式类。还要确保在显示舞台之后调用lookup。 - José Pereda
1
这对我没有用。我给分隔符添加了一个监听器,并在其更改时重写了滑块位置。它有点取巧,但只需要几行代码就可以实现。 - EvilJinious1

6

以上方法对我都无效。我已找到一个解决方案,它对我很有效: 该代码适用于当您的分割窗格位于中间且只有一个分隔符的情况,因此分隔符的位置设置为0.5。如果您不知道分隔符的位置,可以通过divider.getPosition();来获取。

        Divider divider = splitPane.getDividers().get(0);
    divider.positionProperty().addListener(new ChangeListener<Number>()      
    {             
        @Override 
        public void changed( ObservableValue<? extends Number> observable, Number oldvalue, Number newvalue )
        {
            divider.setPosition(0.5);
        }
    }); 

这段代码位于GUI控制器类的initialize()方法中。

当您仍需要鼠标不透明时,此解决方案完美运行。 - Salek

1
在Fxml文件中,将SplitPane的mouseTransparent属性设置为"true"。
<SplitPane dividerPositions="0.5" mouseTransparent="true" prefHeight="652.0" prefWidth="858.0">

1
这将导致分割窗格中的所有包含节点也变为mouseTransparent。这样,您就无法再通过鼠标与任何子节点进行交互了。 - Manuel Mauky

0
你也可以修改SplitPane的Skin类。只需从GrepCode中复制SplitPaneSkin的代码(此处可用),并在initializeDivderEventHandlers()方法中删除MouseListeners,在setGrabberStyle()方法中删除setCursor调用,然后您就无法通过拖动分隔符来调整窗格大小;-) 最后,您只需要通过调用setSkin将皮肤设置为SplitPane即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接