添加/删除项目时控制 JavaFX ToolBar 大小

Controlling JavaFX ToolBar size when adding / removing items

我正在使用 BorderPane 在所有基点(即顶部、左侧、右侧、底部)放置 4 个工具栏。当工具栏展开以接受其第一项时,当工具栏变空时,这种增长不会恢复。当它什么都没有时,我希望它缩小到初始状态。手动设置宽度或高度没有任何作用,因为我确定这些是由其布局处理的。

编辑:我添加了图片来说明我的意思

初始状态(空工具栏,我设置fx-border-color为红色)

已添加第一项

项目已删除,显示未恢复为初始形式的工具栏

ToolBar 不是一个窗格,所以它背后可能有不同的布局逻辑。实际上它似乎是为了永久显示一些按钮控件而设计的。

当它没有要显示的项目时,您可以完全隐藏它,而不是设置它的大小:

toolbar.visibleProperty().bind( Bindings.isNotEmpty( toolbar.getItems() ) );

编辑:完整示例

@Override
public void start( Stage stage )
{

    BorderPane borderPane = new BorderPane();
    ToolBar toolbar = new ToolBar();
    toolbar.setStyle( "-fx-border-color: red" );

    toolbar.visibleProperty().bind( Bindings.isNotEmpty( toolbar.getItems() ) );

    HBox hbox = new HBox();
    borderPane.setLeft( toolbar );
    borderPane.setTop( hbox );

    Button add = new Button( "add" );
    add.setOnAction( ( ActionEvent event ) ->
    {
        toolbar.getItems().add( new Button( "dummy" ) );
    } );

    Button remove = new Button( "remove" );
    remove.setOnAction( ( ActionEvent event ) ->
    {
        toolbar.getItems().remove( 0 );
    } );

    hbox.getChildren().addAll( add, remove );

    final Scene scene = new Scene( borderPane, 800, 600 );
    stage.setScene( scene );
    stage.show();

}

我找到了这个问题的解决方案,尽管它可能不是很长一段时间内的最佳解决方案 运行。

因为我发现无法恢复到工具栏最初为空时的大小,所以我向工具栏的项目添加了一个更改侦听器,以便在它为空时将其从布局中删除,并在它为空时恢复它'不再空了,像这样:

        leftToolbar.getItems().addListener(new ListChangeListener<Node>(){

        @Override
        public void onChanged(javafx.collections.ListChangeListener.Change<? extends Node> c) {
            if(leftToolbar.getItems().isEmpty()) {
                borderPane.setLeft(null);
            } else if(borderPane.getLeft() == null) {
                borderPane.setLeft(leftToolbar);
            }
        }

    });