javafx - 在 FXML 中填充 TabPane 的内容,但不填充选项卡栏

标签 javafx tabs fxml

我正在寻找一种优雅的方式来设置 TabPane 的填充,但不填充标签栏:

<TabPane>
    <padding>
        <Insets top="10" bottom="10" right="10" left="10" />
    </padding>
    <Tab text="red">
        <Rectangle fill="RED" width="200" height="200" />
    </Tab>
    <Tab text="blue">
        <Rectangle fill="BLUE" width="200" height="200" />
    </Tab>
</TabPane>

给出: (unwanted) global padding

但是,

<TabPane>
    <Tab text="red">
        <VBox>
            <padding>
                <Insets top="10" bottom="10" right="10" left="10" />
            </padding>
            <Rectangle fill="RED" width="200" height="200" />
        </VBox>
    </Tab>
    <Tab text="blue">
        <VBox>
            <padding>
                <Insets top="10" bottom="10" right="10" left="10" />
            </padding>
            <Rectangle fill="BLUE" width="200" height="200" />
        </VBox>
    </Tab>
</TabPane>

给出: Correct padding

这正是我想要的,但是我想简化 FXML 结构,主要是通过重构 <padding>元素,因此它在一个位置声明(较短且不重复的代码),而不是在 Pane 的每个选项卡中声明。

那么有什么办法可以实现这一点吗?或者我是否坚持重复的<padding>元素?我更喜欢 FXML 解决方案,但如果没有办法,Java 解决方案也可以。

最佳答案

一句话:不。

TabPane 的每个 Tab 都接受其 contentPropertyNode。内容本身不是 Region,因此不能对其应用 Insets 或填充。 TabPane 本身不包含允许您同时设置所有子 Tabs 内容样式的方法。

您必须首先向 Tab 添加某种容器才能应用填充。因此,您问题中的第二种方法完成您想要做的事情的最简单方法。

解决方法

虽然这无法通过 FXML 完成,但您可以在加载场景后使用 Java 循环向所有 Tab 对象添加相同的填充:

Insets insets = new Insets(10);
for (Tab tab : tabPane.getTabs()) {
    ((VBox) tab.getContent()).setPadding(insets);
}

当然,这假设您使用 VBox 来存储所有选项卡的内容。

关于javafx - 在 FXML 中填充 TabPane 的内容,但不填充选项卡栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067199/

相关文章:

Javafx GUI 更新

javascript - 在 dojo 选项卡容器中选择选项卡时如何调用函数?

android - 如何设置弹出日历的EditText以选择日期并显示在Tab Activity的EditText中

java - 如何在 JavaFX (fxml) 中制作一个环

java - 为什么我在 io.datafx 中遇到 java.lang.NullPointerException?

java - Java 中有很多类会降低性能吗?

隐藏阶段时的JavaFX 8内存泄漏

css - 在路径中加载带有空格的 JavaFX CSS

javascript - 选项卡的 AngularJS Controller

java - 如何通过 id 更改 fxml 标签文本