2014-12-28 2 views
1

У меня есть приложение с MenuBar, панель инструментов и TableView. В основном, мой MenuBar и панель инструментов размещены в VBOX в верхнем узле BorderPane, в то время как мой TableView находится в центральном узле BorderPane. Моя проблема: я хотел бы скрыть/показать панель инструментов, и я предполагаю, что высота центрального узла будет автоматически изменена макетом BorderPane. Я сделал это в Swing просто так: top.setVisible(false); но в JavaFX, который, кажется, не работает: центральный узел поддерживает одинаковый размер. Я нашел решение, но это неутешительно: я меняю предпочтительную высоту панели инструментов. Смотрите ниже код:Автоматическое изменение размера центра узла BorderPane

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> 

Есть более элегантное решение, чем?

ответ

3

Вы можете установить верхнюю невидим

top.setVisible(false); 

, что является правильным, но если вы хотите, чтобы освободить пространство, занимаемое компонента вы должны переключить managed состояние тоже:

top.setManaged(false); 

Или, если вы не хотите, чтобы сделать это вручную каждый раз, используйте привязку:

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

меняю для этого: @FXML общественного недействительными handleButton() { \t \t , если (pane.isVisible()) { \t pane.setManaged (ложь); \t pane.setVisible (false); } else { \t pane.setManaged (true); \t pane.setVisible (true); } } – Linuski

+0

Извините за частичный ответ. Это полная версия: меняю для этого: @FXML общественного недействительными handleButton() { \t \t если (pane.isVisible()) { \t pane.setManaged (ложь); \t pane.setVisible (false); } else { \t pane.setManaged (true); \t pane.setVisible (true); } } но это не работает. С другой стороны, это не совсем то, что я хочу, потому что объект панели будет управляться BorderPane не мной. Я надеюсь, что в Swing есть механизм, в котором этот код работает хорошо. – Linuski

+0

JavaFX не является другим Look and Feel for Swing, если вы хотите использовать JavaFX, вам придется адаптироваться к его API. – eckig

Смежные вопросы