我正在寻找一种为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>
但是
<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>
这正是我想要的,但是我想简化FXML结构,主要是通过重构<padding>
元素,以便在一个位置(较短和非重复的代码)声明它,而不是在每个选项卡中声明它。窗格。
那么有什么办法可以做到这一点?还是我坚持重复的<padding>
元素?我希望使用FXML解决方案,但是如果没有办法,那么使用Java是可以的。
答案 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>