В 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:
- таблицы стилей css.
- CSS setStyle команда, выданная из кода.
- java код для укладки.
- атрибуты fxml для укладки.
мои советы:
- используйте таблицы стилей css почти для всех ваш стайлинг.
- используйте вызовы Java API, где у вас есть тысячи узлов или где вы лично предпочитаете безопасность типов и простые возможности отладки, предлагаемые API.
- используйте setStyle только тогда, когда вам нужно динамически изменить стиль, который может только установить с помощью CSS и невозможно установить с помощью API или стилей.
- не применять стиль через fxml.
преимущества использования css таблицы стилей для укладки:
- вы можете отделить стиль от кода.
- вы можете легко определить несколько таблиц стилей и изменить их во время выполнения, чтобы получить разные взгляды на ваше приложение.
- вы используете язык, специально разработанный для укладки.
- вы можете применить таблицы стилей в инструменте проектирования, как 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 на форумах) в большинстве случаев заключается в том, что порядок производительности от большинства исполнителей до наименее исполнителей будет примерно следующим:
- прямой вызов API.
- стиль через FXML.
- стиль применяется через styleclass.
- вызов 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
подход. Стиль определенно попадет в поле зрения. Держать все в одном месте. Почему? не держать его там?
кроме того, что делает ваш код выглядеть чище? Легче читать? Насколько легко это будет поддерживать, вами или кем-то еще по дороге?