В JavaFX я должен использовать методы CSS или setter для изменения свойств на моих узлах пользовательского интерфейса? [закрытый]

есть два способа установить свойства на моих узлах пользовательского интерфейса(метки, кнопки и т. д.)

я мог бы использовать что-то вроде этого:

Button b = new Button("Sample");
b.setTextFill( Paint.valueOf("red") );
b.setTextAlignment( TextAlignment.CENTER );

или я мог бы сделать что-то эквивалентно:

Button b = new Button("Sample");
b.setStyle("-fx-text-alignment: center; -fx-text-fill: red");

мне интересно, является ли один из этих методов предпочтительным по какой-либо причине (кроме личного вкуса)?

2 ответов


ответ на это сводится к личному вкусу немного, но есть некоторые общие эмпирические правила, которые я думаю, полезны.

четыре варианта стиля в JavaFX:

  1. таблицы стилей css.
  2. CSS setStyle команда, выданная из кода.
  3. java код для укладки.
  4. атрибуты fxml для укладки.

мои советы:

  1. используйте таблицы стилей css почти для всех ваш стайлинг.
  2. используйте вызовы Java API, где у вас есть тысячи узлов или где вы лично предпочитаете безопасность типов и простые возможности отладки, предлагаемые API.
  3. используйте setStyle только тогда, когда вам нужно динамически изменить стиль, который может только установить с помощью CSS и невозможно установить с помощью API или стилей.
  4. не применять стиль через fxml.

преимущества использования css таблицы стилей для укладки:

  1. вы можете отделить стиль от кода.
  2. вы можете легко определить несколько таблиц стилей и изменить их во время выполнения, чтобы получить разные взгляды на ваше приложение.
  3. вы используете язык, специально разработанный для укладки.
  4. вы можете применить таблицы стилей в инструменте проектирования, как SceneBuilder.

действительно, последняя точка имеет решающее значение, если вы используете инструмент визуального дизайна-вам действительно нужно использовать таблицы стилей css, чтобы получить максимальную отдачу от него. Если вы применяете стили в коде, а не в таблицах стилей css, вы не сможете визуализировать, как выглядит приложение, когда вы пытаетесь создать его в инструменте визуального дизайна. Если вы применяете стиль через атрибуты fxml, то ваш fxml становится громоздким, поскольку он определяет как структуру, так и макет вашего приложения, а также его стиль - и, как правило, лучше отделить эта озабоченность.

иногда я использую вызовы setStyle в своем коде, но в основном это происходит из-за лени, а не потому, что это рекомендуемый способ сделать это.

необходимость динамического изменения стилей с помощью setStyle должна быть очень ограниченной. Например, в JavaFX 2.2 вы не можете установить цвет фона региона через API. Вы можете установить его с помощью styleclass. Но если вы хотите динамически установить цвет фона для выбранного пользователем цвета, вы можете используйте такой метод setStyle button.setStyle("-fx-text-fill: " + userColor.toString() + ";");. Так что, действительно довольно специализированный.

также обратите внимание, что в JavaFX 8 некоторые вещи, которые могут быть сделаны только в JavaFX 2.2 css (например, установка фона региона), можно будет сделать в коде через Java API. В приведенном выше примере установки цвета заливки пользователя для фона региона использование API Java для этого было бы предпочтительным методом, если используется JavaFX 8.

С точки зрения эффективности воздействия различных случаи использования. Мое понимание (из комментариев сопровождающего реализации css JavaFX на форумах) в большинстве случаев заключается в том, что порядок производительности от большинства исполнителей до наименее исполнителей будет примерно следующим:

  1. прямой вызов API.
  2. стиль через FXML.
  3. стиль применяется через styleclass.
  4. вызов setStyle.

обратите внимание, что приложение css в JavaFX разработано достаточно эффективно, поэтому во многих случаях производительность это не главное соображение. Я предполагаю, что только тогда, когда у вас есть тысячи узлов, стилизованных, будет большое влияние на производительность использования css, хотя у меня нет жестких данных для резервного копирования этой догадки.

в прошлом я видел некоторые комментарии программистов JavaFX, которые они не хотели бы использовать css и предпочитают использовать API JavaFX для стиля своего приложения. Причины приведены для таких вещей, как более простая отладка, все на одном языке, Лучшая интеграция с IDEs для помощи в именах методов, редактировании и проверке статического типа времени компиляции и т. д. И если вы предпочитаете стиль с использованием Java API, а не css по этим причинам в своем собственном коде, это нормально. Но вы просто не сможете выполнить весь стиль, который вам нужен, используя только API Java.

использование css и знание того, как использовать его в JavaFX, имеет решающее значение для владения технологией JavaFX. Основная причина этого в том, что все ядро элементы управления в JavaFX стилизованы css. Даже самое тривиальное приложение JavaFX обычно использует эти элементы управления, и если вы хотите настроить их внешний вид, вам нужно будет понять css (даже если это просто прочитать стандартную таблицу стилей JavaFX css, чтобы вы знали, как стандартные элементы управления стилизованы). И когда дело доходит до настройки стандартных элементов управления, обычно будет проще применить пользовательскую таблицу стилей css.


Я думаю, это можно обсудить, но, на мой взгляд, это вернуться и посмотреть, что вы надеетесь достичь. Если вы планируете изменить свой стиль, он будет очень чистым при определении во внешнем . Затем, если вы измените свой стиль по дороге (или разрешите пользователям изменить свой стиль), он будет изменен в одном месте.

Button b = new Button("Sample");
b.setStyleClass("myClass");

JavaFX работает с MVC подход. Стиль определенно попадет в поле зрения. Держать все в одном месте. Почему? не держать его там?

кроме того, что делает ваш код выглядеть чище? Легче читать? Насколько легко это будет поддерживать, вами или кем-то еще по дороге?