Как JavaFX по сравнению с WPF? [закрыто]

94

Я в основном программист на C #, я перестал писать Java около 10 лет назад, но стараюсь не отставать от технологий Java, читая статьи, общаясь с друзьями и т. Д.

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

Поскольку я хорошо знаком с C # и WPF, я хотел бы понять, насколько похожи или отличаются эти две технологии.

РЕДАКТИРОВАТЬ: Поскольку ответов нет, я постараюсь уточнить:

  1. WPF использует XAML для создания визуального дерева, есть ли в JavaFX что-то подобное?
  2. WPF лучше всего использовать с привязкой к модели представления в шаблоне MVVM, активно ли JavaFX использует привязку?
  3. WPF использует графический процессор для рендеринга, делает ли JavaFX то же самое?
  4. Как Silverlight сравнивается с JavaFX при запуске через браузер на сетевом ПК?

... Еще не все...

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

Авиад П.
источник
7
Забавно, что вопрос с 83 голосами за можно считать неконструктивным.
kristianp

Ответы:

121

Последние пару недель я изучаю 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, который регулярно обновляется информацией от команды разработчиков.

Бенджамин
источник
9
Большое спасибо за это, это очень поучительно. Если бы вы могли еще больше улучшить этот ответ по мере того, как вы продвигаетесь дальше в своих знаниях JavaFX, это было бы потрясающе.
Авиад П.
5
Мне также понравилось читать ваш ответ, и я хотел бы услышать больше, если ваша работа с JavaFX откроет новые идеи.
Пол-Себастьян Маноле
21

Я думаю, что лучший способ почувствовать JavaFX - это просто попробовать. На веб-сайте JavaFX есть несколько хороших руководств. Вот парочка:

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

Для конкретных ответов на ваши вопросы:

  1. JavaFX имеет собственный декларативный язык для создания «визуального дерева», которое не является производным от xml. Пользовательский интерфейс основан на графике сцены, поэтому вы можете применять различные эффекты и анимацию к любому узлу графика. См. Учебные пособия для получения дополнительной информации. Также существует дизайнерский инструмент для JavaFX (который я еще не пробовал).
  2. JavaFX имеет встроенную привязку в язык .
  3. JavaFX на рабочем столе использует Java AWT / Swing, который использует рендеринг на графическом процессоре. Кажется, что каждая версия Java выгружает большую часть своей графики на GPU. Крис Кэмпбелл из Sun написал несколько статей об ускорении GPU . Я не уверен, есть ли в мобильной версии JavaFX ускорение графического процессора. Я обнаружил, что более ранние версии JavaFX не были достаточно производительными для того, что мне было нужно, но я знаю, что последняя версия имеет значительные улучшения производительности по сравнению с предыдущими версиями, и они все еще работают над ее ускорением.
  4. JavaFx использует Java-апплеты для работы в браузере. Начиная с обновления 10 для Java 6, структура Java-апплетов была переработана, и, хотя она не так удобна, как Adobe Flash, она значительно улучшена. Я не уверен, как он сравнивается с Silverlight, за исключением того, что у меня были проблемы с тем, чтобы Silverlight работал в Linux, но JavaFX действительно работал в Linux.

Вот еще один связанный с этим вопрос .

Джей Аскрен
источник
15
Этот ответ устарел, поскольку JavaFX претерпел значительные обновления в Java 7. Смотрите здесь .
Zoltán
7
Вы уверены, что JavaFX использует Swing и AWT? Я считаю, что у него есть собственный движок рендеринга, называемый призмой. При запуске приложения JavaFX поток отправки событий не создается.
Энди до