Я изучаю 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, который регулярно обновляется с информацией от команды разработчиков.
Большое спасибо за это, это очень воспитательно. Если бы вы могли еще больше усилить этот ответ, как только продвигаетесь дальше по своим знаниям JavaFX, это будет потрясающе. –
Мне также понравилось читать ваш ответ и хотелось бы услышать больше, если ваша работа с JavaFX раскрывает дальнейшие идеи. –