Я изучаю JavaFX последние пару недель. Вот общий обзор того, как он сравнивается с WPF в моих глазах:
Все мои комментарии относятся к JavaFX 2.0. Эта информация, вероятно, может быть изменена, поскольку платформа все еще довольно незрелая и активно развивается.
Графика
Как и WPF, JavaFX использует сохраненную систему рендеринга графики. Пользовательский интерфейс содержит граф сцены, состоящий из «узлов», которые можно рассматривать как концептуально похожие на UIElement
в WPF.
JavaFX перенесет рендеринг графики на графический процессор, если он доступен. Графическая система использует 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 для выражения таких отношений.
А.Добавить(В,С);
Если значение B или C изменится, будут созданы соответствующие уведомления, чтобы система знала, что A необходимо переоценить. Обратите внимание, что в этом случае будет выдано исключение, если вы попытаетесь установить значение A, так как оно привязано к другим свойствам, поэтому в данном контексте это не имеет смысла.
Эти выражения могут быть довольно сложными. a = (b + c) * (d - e)
и может включать любое количество свойств. Fluent API довольно прост для чтения и использования, но он не так удобен, как некоторые Fluent API, предоставляемые некоторыми библиотеками Microsoft, но это больше связано с ограничениями языка Java, а не с самим JavaFX.
Простые двунаправленные привязки могут быть созданы между свойствами одного и того же типа, чтобы при обновлении одного свойства другое автоматически отражало изменение.
JavaFX также предоставляет низкоуровневый API для самостоятельной настройки привязок, если вы хотите создать пользовательское выражение привязки, которое не предоставляется API, или если вас беспокоит производительность.
Одно из самых больших отличий между JavaFX и WPF заключается в том, что привязки в первую очередь выполняются в коде в JavaFX, а WPF — в способе установления привязок в разметке.
Введение в свойства и привязки можно найти здесь.
Стили
JavaFX использует CSS для изменения внешнего вида узлов, содержащихся в графе сцены. Доступна полная спецификация, в которой объясняются типы и свойства, которые можно установить для каждого типа узла.
JavaFX также предоставляет некоторые дополнения, которые помогают улучшить CSS, такие как переменные, которые можно определить и использовать в других местах.
.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 некоторые из конкретных областей реализации, позволяя вашим стилям нацеливаться на определенные области элемента управления. Это известно как подструктура элемента управления. НАПРИМЕР. CheckBox
обнажает две подструктуры; поле и галочка позволяют независимо стилизовать каждую часть элемента управления. Обратите внимание, что, как описано ранее, с помощью CSS можно изменить только внешний вид элемента управления, но не ощущение. НАПРИМЕР. вы не можете радикально изменить способ размещения содержимого TabPane
, изменив его внутреннюю панель макета так, как это можно сделать с помощью WPF TabControl
.
Хотя это звучит довольно ограничивающе, предпочтительный способ создания настраиваемых элементов управления в JavaFX, по-видимому, заключается в использовании композиции в соответствии с линиями, производными от панели макета, для размещения стандартных элементов управления и изменения их стиля с помощью CSS.
Заключение
В целом я очень впечатлен тем, что JavaFX может предложить на данный момент. Несмотря на то, что он далеко не такой зрелый, как WPF, он активно развивается, и Oracle, похоже, поддерживает это. Время покажет, удачно это или нет.
Я бы рекомендовал попробовать JavaFX. Прочтите документацию и попробуйте собрать небольшое приложение и посмотреть, что вы думаете.
Вам также следует посетить FXExperience.com, который регулярно обновляется информацией от команды разработчиков.
person
Community
schedule
30.10.2012