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

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

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

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

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

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

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

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

2 ответа

Решение

Я изучаю JavaFX последние пару недель. Вот мой общий обзор того, как он сравнивается с WPF:

Все мои комментарии связаны с JavaFX 2.0. Эта информация, вероятно, будет подвержена изменениям, поскольку платформа все еще довольно незрелая и активно развивается.

Графика

Как и WPF, JavaFX использует систему визуализации с сохранением графики. Пользовательский интерфейс содержит граф сцены, который состоит из "узлов", которые могут быть концептуально похожи на WPF. UIElement,

JavaFX разгрузит рендеринг графики в графический процессор, если он доступен. Графическая система использует DirectX на Windows и OpenGL на других платформах.

наценка

Пользовательские интерфейсы JavaFX могут создаваться как в коде, так и с помощью разметки FXML, которая аналогична XAML в том, что граф объектов может быть создан с помощью вложенных элементов.

FXML имеет некоторые функции, аналогичные XAML, такие как привязка свойств (только для простых выражений) и привязка к обработчикам событий (любой метод onEvent). Обработчики событий могут быть объявлены как in-line, но обычно вы привязываетесь к событию в связанном контроллере.

Файлы FXML могут иметь связанный контроллер, который позволяет объявлять сложные обработчики событий и устанавливать привязки между свойствами. Это контроллер в смысле MVC и не то же самое, что viewModel в мире WPF (обычно контроллер будет иметь ссылки на узлы и элементы управления).

Одно отличие от WPF состоит в том, что кажется, что FXML не скомпилирован в промежуточное двоичное представление, такое как BAML. Я не заметил каких-либо проблем с производительностью, но не использовал систему широко. Однако я заметил, что FXML обычно имеет тенденцию быть короче любого XAML, поскольку платформа по-прежнему поощряет вас писать код, а стили объявляются отдельно.

Введение в FXML можно найти здесь.

Конструктор сцен предоставляется бесплатно (как в пиве), поэтому, если вам не нравится ручное кодирование пользовательского интерфейса, вы можете перетаскивать элементы, устанавливать свойства и привязывать код к вашему контроллеру, и FXML будет сгенерирован автоматически. Очевидно, что построитель сцены далеко не такой мощный, как Expression Blend, но он все же лучше, чем "дизайнер", предоставляемый Visual Studio.

переплет

JavaFX имеет очень мощную систему свойств и привязки. Шаблон Java Bean был расширен за счет включения классов, которые инкапсулируют свойство (аналогично тому, как свойства зависимостей WPF представляют свойства). Эти классы реализуют интерфейсы, которые обеспечивают аннулирование и уведомление об изменениях.

Существует различие между уведомлениями о признании недействительными и уведомлениями об изменениях. Invalidations просто говорят вам, что выражение привязки теперь недопустимо и должно быть пересчитано; пересчет фактически не происходит, пока вы не запросите значение свойства через его get() или же getValue() методы. Однако, если вы зарегистрировали прослушиватель изменений, выражение будет немедленно пересчитано, и все, что связано с этим свойством, будет отражать изменения.

JavaFX предоставляет эти свойства аналогично WPF со свойством get и set и методом, который возвращает экземпляр оболочки свойств (которые не являются статическими, как свойства WPF).

Сложные привязки могут быть созданы между несколькими свойствами. Хотите, чтобы целочисленное свойство было суммой двух других (a = b + c)? Нет проблем, JavaFX предоставляет свободный API для выражения таких отношений, например

A.Добавить (B, C);

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

Эти выражения могут быть довольно сложными, например, a = (b + c) * (d - e) и может включать в себя любое количество свойств. Свободный 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
}

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

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

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

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

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

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

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

Другие вопросы по тегам