Заполнение в FXML содержимым TabPane, но не панелью вкладок - PullRequest
0 голосов
/ 27 июня 2018

Я ищу элегантный способ установки отступа для панели вкладок, но без заполнения панели вкладок:

<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 голосов
/ 27 июня 2018

РЕДАКТИРОВАТЬ: я обновил ответ, чтобы использовать селекторы CSS из комментария Фабиана ниже.

Вы можете установить заполнение для большинства объектов графа сцены JavaFX в отдельном файле CSS. Вам нужно будет связать файл 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>
0 голосов
/ 27 июня 2018

Одним словом: нет.

Каждый 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 для содержимого всех ваших вкладок.

...