Ответ 1
Вы можете установить таблицы стилей на родительских узлах, используя:
parent.getStylesheets().add("/resources/shell.css");
Поскольку элементы и атрибуты, используемые в FXML, производятся из открытого JavaFX Java API, вы также можете назначать таблицы стилей родительскому node, используя элемент таблицы стилей FXML (или взаимозаменяемый атрибут). Поскольку все контейнеры расширяют Parent, вы можете установить одну или несколько пользовательских таблиц стилей в любом контейнере, который вы ссылаетесь в FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.net.URL?>
....
<?scenebuilder-stylesheet fruitcombo.css?>
<AnchorPane prefHeight="205.0" prefWidth="168.0"
styleClass="layout"
fx:controller="fruit.FruitComboController"
xmlns:fx="http://javafx.com/fxml">
<children>
....
</children>
<stylesheets>
<URL value="@fruitcombo.css" />
</stylesheets>
</AnchorPane>
Смотрите файл fxml в этот пример для полного исполняемого примера ссылки на файл css из файла fxml.
В приведенном выше коде есть несколько приятных функций:
Странный префикс @
в URL-адресе stylesheets строго не нужен, но может использоваться для использования JavaFX разрешение местоположения, "Оператор разрешения местоположения (представленный префиксом" @ "для значения атрибута) используется для указания того, что значение атрибута должно рассматриваться как местоположение относительно текущего файла, а не простая строка".
Следующая строка не требуется во время выполнения, но используется инструментом SceneBuilder, чтобы найти нужную таблицу стилей CSS во время разработки, если вы используете этот инструмент:
<?scenebuilder-stylesheet fruitcombo.css?>
Обновление комментария
Предупреждение: это FXML 1.0, он не работает в версии 2.0, javafx.fxml.LoadException: URL не является допустимым типом.
Этот комментарий немного неверен, я думаю. Насколько мне известно, в настоящее время FX32 2.0 не существует.
Причина, по которой комментатор получил LoadException, состояла в том, что показательный фрагмент в этом сообщении не импортировал класс java.net.URL
в документ FXML. Я обновил фрагмент, чтобы включить импорт java.net.URL
и добавить еще несколько эллипсисов ....
, чтобы уточнить намерение фрагмента. ellipsis означает "ряд точек, которые обычно указывают на умышленное упущение слова, предложения или цельной секции из текста без изменения его первоначальное значение".
Чтобы лучше понять этот ответ, предлагается скомпилировать и запустить связанный образец кода.
Предупреждение против использования функций загрузки InputStream в FXMLLoader
Я настоятельно рекомендую создать новое FXMLLoader с местоположением, вместо использования функция FXMLLoader.load(InputStream). Когда используется функция static load(), ссылки на относительные местоположения не могут быть разрешены, так как нет базового местоположения для файла FXML.
I.e., не делайте:
InputStream input = this.getClass().getResourceAsStream("layout.fxml");
FXMLLoader loader = new FXMLLoader.load(input);
Parent content = loader.load();
Вместо этого выполните:
String url = this.getClass().getResource("layout.fxml").toExternalForm();
FXMLLoader loader = new FXMLLoader(url);
Parent content = loader.load();