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

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

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

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

EDIT: видя, как нет ответов, я постараюсь быть более конкретным:

  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 разгрузит графический рендеринг на GPU, если он доступен. Графическая система использует DirectX на Windows и OpenGL на других платформах.

разметки

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

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

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

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

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

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

обязательные

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

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

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

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

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

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

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

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

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

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

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

стили

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

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

.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, но чувствовать не может. Например, вы не можете кардинально изменить способ a TabPane выкладывает свое содержание путем изменять свою внутреннюю панель плана внутри как вы можете с WPF TabControl.

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

вывод

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

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

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


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

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

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

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

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