Подтвердить что ты не робот

Устанавливает стили декларативно в FXML

В HTML мы привыкли к тонкости программирования программных таблиц типа

<link rel="stylesheet" ... >

Но примеры установки таблиц стилей, которые я нашел для JavaFX, требуют программных таблиц стилей, например

scene.getStylesheets().add("/resources/shell.css");

Можно ли установить таблицы стилей в FXML, подобные тому, как это делается в HTML?

4b9b3361

Ответ 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();  

Ответ 2

Да, посмотрите пример 4-8 из этот учебник, применив следующий атрибут к node:

stylesheets="fxmlexample/Login.css"

например.

<GridPane stylesheets="fxmlexample/Login.css">

Ответ 3

Если вы собираетесь использовать fxml с JavaFX, вам потребуется некоторое время для загрузки и использования SceneBuilder. Как только вы это сделаете, использование таблиц стилей CSS станет простым. Конечно, используйте NetBeans, поскольку с запуском SceneBuilder, открыв предварительно созданный файл dxml в приложении шаблона dxml NetBeans, он автоматически открывается для редактирования в SceneBuilder. После того, как вы вырвали все элементы StackPlane, кнопку и ярлык и поместили в нужные элементы управления и контейнеры, просто добавьте таблицу стилей непосредственно в SceneBuilder. В главном меню в разделе "Предварительный просмотр" есть выбор меню для таблиц стилей CSS. При его выборе появляется подменю, которое позволит вам загрузить файл таблицы стилей.

После загрузки файла элементы управления будут отображаться в соответствии с правилами в таблице стилей, они не покажут этот скин, пока вы не выберете каждый из них в разделе свойств SceneBuilder и не объявите эту таблицу стилей применительно к это управление. Затем стиль отобразится при запуске приложения.