自动调整BorderPane中心节点的大小

时间:2014-12-28 12:08:07

标签: javafx javafx-2 javafx-8

我有一个带有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>

有比这更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

您可以通过

设置顶部不可见
top.setVisible(false);

这是正确的,但是如果你想释放组件占用的空间,你也必须切换managed状态:

top.setManaged(false);

或者,如果您不想每次都手动执行此操作,请使用绑定:

top.managedProperty().bind(top.visibleProperty());