Ответ 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, который регулярно обновляется с информацией от команды разработчиков.