У меня есть приложение с 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>
Есть более элегантное решение, чем?
меняю для этого: @FXML общественного недействительными handleButton() { \t \t , если (pane.isVisible()) { \t pane.setManaged (ложь); \t pane.setVisible (false); } else { \t pane.setManaged (true); \t pane.setVisible (true); } } – Linuski
Извините за частичный ответ. Это полная версия: меняю для этого: @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
JavaFX не является другим Look and Feel for Swing, если вы хотите использовать JavaFX, вам придется адаптироваться к его API. – eckig