我有一个带有MenuBar,工具栏和TableView的应用程序。
基本上,我的MenuBar和工具栏放在BorderPane顶部节点的VBOX中,而我的TableView位于BorderPane的中心节点。
我的问题是:我想隐藏/显示工具栏,我认为中心节点的高度将由BorderPane的布局自动更改。
我只是通过这个在Swing中做到了这一点:
top.setVisible(false);
但在JavaFX中似乎不起作用:中心节点保持相同的大小。
我找到了一个解决方案,但令人失望:我改变了工具栏的首选高度。请参阅以下代码:
public class Controller
{
@FXML
Pane pane;
private double height;
@FXML
public void handleButton()
{
// BAD code: doesn't work
// if (pane.isVisible())
// pane.setVisible(false);
// else
// pane.setVisible(true);
if (pane.getPrefHeight() < 1.0)
pane.setPrefHeight(height);
else
{
height = pane.getPrefHeight();
pane.setPrefHeight(0.0);
}
}
}
和相应的FXML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="445.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
<top>
<VBox prefHeight="134.0" prefWidth="600.0" style="-fx-background-color: gray;">
<children>
<AnchorPane prefWidth="200.0">
<children>
<MenuBar AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
<Pane fx:id="pane" prefHeight="200.0" prefWidth="200.0" style="-fx-background-color: yellow;" BorderPane.alignment="CENTER" />
</children>
</VBox>
</top>
<center>
<VBox alignment="CENTER" style="-fx-background-color: green;">
<children>
<Button mnemonicParsing="false" onAction="#handleButton" text="Button" />
</children>
</VBox>
</center>
</BorderPane>
有比这更优雅的解决方案吗?
答案 0 :(得分:3)
您可以通过
设置顶部不可见top.setVisible(false);
这是正确的,但是如果你想释放组件占用的空间,你也必须切换managed
状态:
top.setManaged(false);
或者,如果您不想每次都手动执行此操作,请使用绑定:
top.managedProperty().bind(top.visibleProperty());