2010-01-06 3 views
75

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

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

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

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

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

... Больше прибыть ...

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

ответ

101

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

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

Графика

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

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

разметки

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

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

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

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

Введение в FXML можно найти here.

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

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

Стили

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 можно найти here.

Компоновка

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

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

управления

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

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

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

Заключение

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

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

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

+5

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

+3

Мне также понравилось читать ваш ответ и хотелось бы услышать больше, если ваша работа с JavaFX раскрывает дальнейшие идеи. –

20

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

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

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

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

Here's another related question.

+14

Этот ответ устарел, поскольку JavaFX прошел значительные обновления в Java 7. [См. Здесь] (http://docs.oracle.com/javafx/2/overview/jfxpub-overview.htm). –

+6

Вы уверены, что JavaFX использует swing и AWT? Я считаю, что у него есть собственный механизм рендеринга, называемый призмой. При запуске приложения JavaFX не создается поток событий Dispatch. –

Смежные вопросы