Как JavaFX сравнивается с WPF?

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

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

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

EDIT: Увидев, что ответов нет, я постараюсь уточнить:

  • WPF использует XAML для создания визуального дерева, имеет ли JavaFX что-то подобное?
  • WPF лучше всего использовать с привязкой к модели представления в шаблоне MVVM, действительно ли JavaFX широко использует привязку?
  • WPF использует GPU для рендеринга, делает ли JavaFX то же самое?
  • Как Silverlight сравнивается с JavaFX при запуске через браузер на сетевом компьютере?

... Еще впереди...

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

Ответ 1

Я изучаю 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 для выражения таких отношений E.G.

A.Add(B, C);

Если значение B или C изменится, то соответствующие уведомления будут подняты, чтобы система узнала, что A необходимо переоценить. Обратите внимание, что в этом случае будет выведено исключение, если вы попытаетесь установить значение A, поскольку оно связано с другими свойствами, поэтому в этом контексте это не имеет смысла.

Эти выражения могут быть довольно сложными E.G. a = (b + c) * (d - e) и может включать любое количество свойств. Свободный API довольно легко читается и используется, но не так хорош, как некоторые из Fluent API, предоставляемые некоторыми из библиотек Microsoft, но это больше зависит от ограничений языка Java, а не от самого JavaFX.

Простые двунаправленные привязки могут быть созданы между свойствами одного и того же типа, так что, если один из них обновляется, другой автоматически отражает изменение.

JavaFX также предоставляет API низкого уровня для индивидуальной настройки привязок, если вы хотите создать собственное выражение привязки, которое не предоставляется API, или если вас беспокоит производительность.

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

Введение в свойства и привязки можно найти здесь.

Стили

JavaFX использует CSS для изменения внешнего вида узлов, содержащихся в графе сцены. Существует полная спецификация, которая объясняет типы и свойства, которые могут быть установлены для каждого типа node.

JavaFX также предоставляет некоторые дополнения, которые помогают улучшить CSS, такие как переменные, которые могут быть определены и использованы в других местах E.G.

.button {
    my-custom-color: RGB(234, 44, 78);
}

.my-control {
    -fx-background-color: my-custom-color
}

Он также предоставляет несколько функций, которые позволяют получать цвета из других ранее определенных цветов, которые полезны для создания таких вещей, как градиенты. Это означает, что базовая палитра цветов может быть определена, а остальная часть может быть сгенерирована из этих значений (это то, что делает файл CSS по умолчанию JavaFX).

JavaFX CSS не позволяет вам определить тип макета, используемый node (так как для написания всего этого макета необходимо выполнить в коде). Это очень хорошо работает для меня, поскольку это был один из аспектов CSS, который действительно вызывал у меня боль при использовании его с HTML.

Лично я предпочитаю CSS для стилей XAML, которые, как правило, слишком многословны для меня.

Руководство по JavaFX CSS можно найти здесь.

Разметка

JavaFX предоставляет несколько макетов, которые аналогичны тем, которые предоставляются WPF. Одна разница, которую я заметил, заключается в том, что контракт измерения и макета определяется далее в цепочке наследования в классе Region.

Как упоминалось ранее, макет не может быть выполнен с использованием CSS, но может быть выражен с помощью кода, FXML или создан с использованием построителя сцен (который в конечном итоге преобразован в FXML).

Управление

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

Элементы управления выставляют некоторые из областей, специфичных для реализации, для CSS, позволяя настраивать определенные области элемента управления вашими стилями. Это называется подструктурой контроля. НАПРИМЕР. a CheckBox раскрывает две подструктуры; ящик и галочку, позволяющие индивидуально настраивать каждую часть элемента управления. Обратите внимание, что, как описано ранее, только внешний вид элемента управления может быть изменен с помощью CSS, но ощущение не может. НАПРИМЕР. вы не можете резко изменить способ, которым TabPane выводит его содержимое, изменяя его внутреннюю панель макета так, как вы можете с WPF TabControl.

Хотя это звучит довольно ограниченно, предпочтительный способ создания пользовательских элементов управления в JavaFX, по-видимому, использует композицию по линиям вывода из панели макета для размещения стандартных элементов управления и повторного моделирования их с помощью CSS.

Заключение

В целом я очень впечатлен тем, что JavaFX может предложить на данный момент. Несмотря на то, что он не настолько близок как зрелый, как WPF, он активно развивается, и, судя по всему, Oracle поддерживает это. Время покажет, успешно ли оно или нет.

Я бы рекомендовал попробовать JavaFX. Прочтите документацию и попробуйте собрать небольшое приложение и посмотреть, что вы думаете.

Вы также должны проверить FXExperience.com, который регулярно обновляется с информацией от команды разработчиков.

Ответ 2

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

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

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

  • JavaFX имеет собственный декларативный язык для создания "визуального дерева", которое не является производным xml. Пользовательский интерфейс основан на графике сцены, поэтому вы можете применять различные эффекты и анимацию к любому node на графике. Дополнительную информацию см. В руководствах. Существует также дизайнерский инструмент для JavaFX (который я еще не пробовал).
  • JavaFX имеет привязку, встроенную в язык.
  • JavaFX на рабочем столе использует Java AWT/Swing, который использует рендеринг графического процессора. Каждая версия Java, похоже, выгружает большую часть своей графики на графический процессор. Крис Кэмпбелл из Sun рассказал о ускорение GPU. Я не уверен, что мобильная версия JavaFX имеет ускорение GPU. Я обнаружил, что более ранние версии JavaFX недостаточно эффективны для того, что мне нужно, но я знаю, что последняя версия имеет значительные улучшения производительности по сравнению с предыдущими версиями, и они все еще работают над тем, чтобы сделать ее быстрее.
  • JavaFx использует Java-апплеты для запуска в браузере. Что касается обновления Java 6 10, инфраструктура Java-апплетов была переработана, и хотя она не такая бесшовная, как Adobe flash, она значительно улучшена. Я не уверен, как он сравнивается с Silverlight, кроме того, что мне не удалось заставить Silverlight работать в Linux, но действительно ли JavaFX работает в Linux.

Вот еще один смежный вопрос.