Последние пару недель я изучаю JavaFX. Вот общий обзор того, как он на мой взгляд сравнивается с WPF:
Все мои комментарии относятся к JavaFX 2.0. Эта информация, вероятно, будет изменена, поскольку платформа еще довольно незрелая и активно развивается.
Графика
Как и WPF, JavaFX использует сохраненную систему рендеринга графики. Пользовательский интерфейс содержит граф сцены, состоящий из «узлов», которые можно рассматривать как концептуально аналогичные WPF UIElement
.
JavaFX разгрузит рендеринг графики на GPU, если он доступен. Графическая система использует DirectX в Windows и OpenGL на других платформах.
Разметка
Пользовательские интерфейсы JavaFX могут быть созданы как в коде, так и с помощью разметки FXML, которая аналогична XAML в том, что граф объектов может быть создан путем вложения элементов.
FXML имеет некоторые функции, аналогичные XAML, такие как привязка свойств (только простые выражения) и привязка к обработчикам событий (любой метод onEvent ). Обработчики событий могут быть объявлены встроенными, но обычно вы должны привязаться к событию в связанном контроллере.
Файлы FXML могут иметь связанный контроллер, который позволяет объявлять сложные обработчики событий и устанавливать привязки между свойствами. Это контроллер в смысле MVC и не то же самое, что viewModel в мире WPF (обычно контроллер будет иметь ссылки на узлы и элементы управления).
Одно из отличий от WPF заключается в том, что, похоже, FXML не компилируется в промежуточное двоичное представление, такое как BAML. Я пока не заметил каких-либо проблем с производительностью, но широко не использовал систему. Однако я заметил, что FXML обычно бывает короче любого XAML, поскольку платформа по-прежнему поощряет писать код, а стили объявляются отдельно.
Введение в FXML можно найти здесь .
Построитель сцены предоставляется бесплатно (как в пиве), поэтому, если вам не нравится ручное кодирование пользовательского интерфейса, вы можете перетаскивать элементы, устанавливать свойства и связываться с кодом в вашем контроллере, и FXML будет создан автоматически. Очевидно, что построитель сцены далеко не такой мощный, как Expression Blend, но он все же лучше, чем «конструктор», предоставляемый Visual Studio.
Привязка
JavaFX имеет очень мощную систему свойств и привязок. Шаблон Java Bean был расширен и теперь включает классы, которые инкапсулируют свойство (аналогично тому, как свойства зависимостей WPF представляют свойства). Эти классы реализуют интерфейсы, которые обеспечивают аннулирование и уведомление об изменении.
Существует различие между уведомлениями об аннулировании и уведомлениями об изменениях. Недействительность просто говорит вам, что выражение привязки теперь недействительно и его необходимо пересчитать; пересчет фактически не происходит, пока вы не запросите значение свойства через его методы get()
или getValue()
. Однако, если вы зарегистрировали прослушиватель изменений, выражение будет немедленно повторно оценено, и все, что связано с этим свойством, отразит изменения.
JavaFX предоставляет эти свойства аналогично WPF с помощью свойства get и set и метода, который возвращает экземпляр оболочки свойства (который не является статическим, как свойства WPF).
Между несколькими свойствами могут быть созданы сложные привязки . Хотите, чтобы целочисленное свойство было суммой двух других (a = b + c)? Нет проблем, JavaFX предоставляет Fluent API для выражения такого рода отношений EG
A. Добавить (B, C);
Если значение B или C изменится, будут выданы соответствующие уведомления, чтобы система знала, что A необходимо повторно оценить. Обратите внимание, что в этом случае будет сгенерировано исключение, если вы попытаетесь установить значение A, поскольку оно привязано к другим свойствам, поэтому в данном контексте это не имеет смысла.
Эти выражения могут быть довольно сложными EG a = (b + c) * (d - e)
и включать любое количество свойств. Fluent API довольно прост для чтения и использования, но он не так хорош, как некоторые из Fluent API, предоставляемых некоторыми библиотеками Microsoft, но это больше связано с ограничениями языка Java, чем с самим JavaFX.
Между свойствами одного типа могут быть созданы простые двунаправленные привязки, так что если одно обновляется, другое автоматически отражает это изменение.
JavaFX также предоставляет низкоуровневый API для самостоятельной настройки привязок, если вы хотите создать настраиваемое выражение привязки, которое не предоставляется API, или если вас беспокоит производительность.
Одно из самых больших различий между JavaFX и WPF заключается в том, что привязки в основном выполняются в коде в JavaFX, а не в способе установления привязок в разметке WPF.
Введение свойств и привязок можно найти здесь .
Стили
JavaFX использует CSS для изменения внешнего вида узлов, содержащихся в графе сцены. Доступна полная спецификация, в которой объясняются типы и свойства, которые могут быть установлены для каждого типа узла.
JavaFX также предоставляет некоторые дополнения, которые помогают улучшить CSS, такие как переменные, которые могут быть определены и использованы где-либо еще. EG
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Он также предоставляет несколько функций, которые позволяют получать цвета из других ранее определенных цветов, что полезно для создания таких вещей, как градиенты. Это означает, что может быть определена базовая палитра цветов, а остальные могут быть сгенерированы из этих значений (это то, что делает файл CSS JavaFX по умолчанию).
JavaFX CSS не позволяет вам определять тип макета, используемого узлом (на момент написания этого макета все макеты должны выполняться в коде). Это работает для меня очень хорошо, поскольку это был единственный аспект CSS, который действительно причинял мне боль при использовании его с HTML.
Лично я предпочитаю CSS стилям XAML, которые, на мой вкус, слишком подробны.
Руководство по JavaFX CSS можно найти здесь .
Макет
JavaFX предоставляет ряд панелей макета, аналогичных тем, которые предоставляет WPF. Одно различие, которое я заметил, заключается в том, что контракт меры и макета определяется дальше по цепочке наследования в Region
классе.
Как упоминалось ранее, макет нельзя выполнить с помощью CSS, но можно выразить с помощью кода, FXML или создать с помощью построителя сцены (который в конечном итоге преобразуется в FXML).
Управление
JavaFX предоставляет постоянно растущую библиотеку элементов управления, которых мы и ожидали. Одно из основных различий между JavaFX и WPF заключается в том, что элементы управления по сути являются черными ящиками и не могут быть повторно шаблонизированы так, как элементы управления WPF. Также кажется, что они предоставляют гораздо меньше свойств, чем элементы управления WPF.
Элементы управления действительно открывают некоторые области реализации для CSS, позволяя нацеливать определенные области элемента управления вашими стилями. Это называется подструктурой элемента управления. EG a CheckBox
предоставляет две подструктуры; флажок и флажок, позволяющий стилизовать каждую часть элемента управления независимо. Обратите внимание, что, как описано ранее, с помощью CSS можно изменить только внешний вид элемента управления, но не ощущение . Например, вы не можете кардинально изменить способ размещения TabPane
своего содержимого, изменив его внутреннюю панель макета так, как вы можете с WPF TabControl
.
Хотя это звучит довольно ограничивающе, предпочтительный способ создания настраиваемых элементов управления в JavaFX, по-видимому, заключается в использовании композиции в соответствии с линиями заимствования из панели макета для размещения стандартных элементов управления и изменения их стиля с помощью CSS.
Вывод
В целом я очень впечатлен тем, что JavaFX может предложить на данный момент. Хотя он далеко не такой зрелый, как WPF, он активно развивается, и Oracle определенно поддерживает это. Успешно это или нет, покажет время.
Я бы рекомендовал попробовать JavaFX. Прочтите документацию и попробуйте собрать небольшое приложение и посмотрите, что вы думаете.
Вам также следует посетить FXExperience.com, который регулярно обновляется информацией от команды разработчиков.