添加/删除项目时控制 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);
}
}
});
我正在使用 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);
}
}
});