JavaFX - TabPane/Tab 如何添加填充选项卡大小的内容?
JavaFX - TabPane/Tab How to add content which fills the tab in size?
我正在玩 JavaFX,遇到一个小问题,我无法解决。
我想向现有的 TabPane 添加一个新的选项卡(来自 FXML)。
这是我的代码:
try
{
URL location = WPClientController.class.getResource("WPClient.fxml");
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
Node node = (Node) fxmlLoader.load(location.openStream());
Tab newTab = new Tab("engel", node);
fxTabWP.getTabs().add(newTab);
}
catch (Exception exception)
{
//no real error handling...just print the stacktrace...
exception.printStackTrace();
}
此代码将导致:
代码有效,但是(如屏幕截图所示)添加的节点(此处为 SplitPane)使用其首选大小(在 TabPage 上,这对我来说是错误的)。
添加的 SplitPane 的大小应与其父容器的大小相同。 (当父容器增长或收缩时,它应该增长和收缩)(如 Swing 中的 BorderLayout)
编辑(这里是 TAB FXML 的 [现在是正确的] 内容):
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.test.ui.fx.client.ClientController">
<children>
<HBox prefHeight="100.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
<children>
<SplitPane dividerPositions="0.29797979797979796" prefHeight="160.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
<items>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TreeView fx:id="fxTreeView" prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS" />
</children>
</HBox>
<HBox fx:id="fxTreeNodeContentBox" prefHeight="100.0" prefWidth="200.0" />
</items>
</SplitPane>
</children>
</HBox>
</children>
</VBox>
我的问题:什么是待办事项,所以 SplitPane 的大小会动态适应它的父容器大小?
您的 FXML 文件有一个根元素
<VBox maxHeight="-Infinity" maxWidth="-Infinity" ... >
maxHeight
和 maxWidth
属性阻止它超出其首选大小。 (此外,出于某种原因,其子元素的首选大小设置为固定值。)如果删除这些属性,它将允许根元素根据需要增长。
我正在玩 JavaFX,遇到一个小问题,我无法解决。
我想向现有的 TabPane 添加一个新的选项卡(来自 FXML)。
这是我的代码:
try
{
URL location = WPClientController.class.getResource("WPClient.fxml");
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
Node node = (Node) fxmlLoader.load(location.openStream());
Tab newTab = new Tab("engel", node);
fxTabWP.getTabs().add(newTab);
}
catch (Exception exception)
{
//no real error handling...just print the stacktrace...
exception.printStackTrace();
}
此代码将导致:
代码有效,但是(如屏幕截图所示)添加的节点(此处为 SplitPane)使用其首选大小(在 TabPage 上,这对我来说是错误的)。
添加的 SplitPane 的大小应与其父容器的大小相同。 (当父容器增长或收缩时,它应该增长和收缩)(如 Swing 中的 BorderLayout)
编辑(这里是 TAB FXML 的 [现在是正确的] 内容):
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.test.ui.fx.client.ClientController">
<children>
<HBox prefHeight="100.0" prefWidth="200.0" VBox.vgrow="ALWAYS">
<children>
<SplitPane dividerPositions="0.29797979797979796" prefHeight="160.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
<items>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TreeView fx:id="fxTreeView" prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS" />
</children>
</HBox>
<HBox fx:id="fxTreeNodeContentBox" prefHeight="100.0" prefWidth="200.0" />
</items>
</SplitPane>
</children>
</HBox>
</children>
</VBox>
我的问题:什么是待办事项,所以 SplitPane 的大小会动态适应它的父容器大小?
您的 FXML 文件有一个根元素
<VBox maxHeight="-Infinity" maxWidth="-Infinity" ... >
maxHeight
和 maxWidth
属性阻止它超出其首选大小。 (此外,出于某种原因,其子元素的首选大小设置为固定值。)如果删除这些属性,它将允许根元素根据需要增长。