Чем JavaFX отличается от WPF?

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

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

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

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

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

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

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


person Community    schedule 06.01.2010    source источник
comment
Забавно, что вопрос с 83 голосами можно считать неконструктивным.   -  person kristianp    schedule 20.03.2019


Ответы (2)


Я изучаю 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
comment
Большое спасибо за это, это очень поучительно. Если бы вы могли еще больше улучшить этот ответ по мере того, как вы продвигаетесь в своих знаниях о JavaFX, это было бы здорово. - person Aviad P.; 30.10.2012
comment
Мне также понравилось читать ваш ответ, и я хотел бы услышать больше, если ваша работа с JavaFX откроет новые идеи. - person Paul-Sebastian Manole; 10.09.2015

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

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

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

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

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

person Jay Askren    schedule 10.01.2010
comment
Этот ответ устарел, так как JavaFX претерпел значительные обновления в Java 7. см. здесь. - person Zoltán; 10.09.2012
comment
Вы уверены, что JavaFX использует свинг и AWT? Я полагаю, что у него есть собственный движок рендеринга под названием prism. При запуске приложения JavaFX не создается поток отправки событий. - person Andy Till; 27.10.2012