在FXML中填充TabPane的内容,但不填充标签栏

时间:2018-06-27 16:07:41

标签: 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>元素,以便在一个位置(较短和非重复的代码)声明它,而不是在每个选项卡中声明它。窗格。

那么有什么办法可以做到这一点?还是我坚持重复的<padding>元素?我希望使用FXML解决方案,但是如果没有办法,那么使用Java是可以的。

2 个答案:

答案 0 :(得分:2)

总之:不。

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

您必须先将某种容器添加到Tab才能应用填充。因此,问题中的第二种方法 是完成您要完成的工作的最简单方法。

解决方法

虽然FXML无法做到这一点,但是您可以使用Java循环在加载场景后向所有Tab对象添加相同的填充:

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

当然,这假定您对所有标签页的内容使用VBox

答案 1 :(得分:1)

编辑:我更新了答案,以便从下面的fabian注释中使用CSS选择器。

您可以在单独的css文件中为大多数JavaFX场景图对象设置填充。您需要将css文件链接到您的FXML文件,这将在下面显示。 css文件和FXML文件将需要位于同一目录中,否则,您将不得不编辑value="..."标签。

style.css

.tab-pane > .tab-content-area > * {
    -fx-padding: 10 10 10 10;
}

这会将填充设置为恰好位于某个地方VBox下的所有Tab(无论层次结构有多深)

main.fxml

<TabPane>
    <Tab text="red">
        <VBox> 
            <Rectangle fill="RED" width="200" height="200" />
        </VBox>
    </Tab>
    <Tab text="blue">
        <VBox>
            <Rectangle fill="BLUE" width="200" height="200" />
        </VBox>
    </Tab>

    <stylesheets>
        <URL value="@style.css" />
    </stylesheets>
</TabPane>