Я вчу 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 and set та методу, який повертає екземпляр обгортки властивості (які не є статичними, як WPF властивості).
Складні прив’язки можуть бути створені між кількома властивостями. Хочете, щоб ціле властивість було сумою двох інших (a = b + c)? Немає проблем, JavaFX надає Fluent API для вираження подібних відносин EG
A.Add (B, C);
Якщо значення B або C змінюється, відповідні сповіщення будуть підняті таким чином, що система знає, що A потрібно переоцінити. Зауважте, що в цьому випадку виняток буде викинуто, якщо ви спробуєте встановити значення A, оскільки воно пов'язане з іншими властивостями, так що це не має сенсу в цьому контексті.
Ці вирази можуть бути досить складними EG 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
}
Він також пропонує пару функцій, які дозволяють отримувати кольори з інших раніше визначених кольорів, що корисно для створення таких речей, як градієнти. Це означає, що можна визначити базову палітру кольорів, а решта можна згенерувати з цих значень (саме це робить CSS-файл JavaFX за замовчуванням).
JavaFX CSS не дозволяє визначити тип компонування, який використовується вузлом (на момент написання цього макета потрібно виконувати в коді). Це дуже добре працює для мене, оскільки це був єдиний аспект CSS, який справді заподіював мені біль при використанні його з HTML.
Особисто я віддаю перевагу стилям CSS перед XAML, які, як правило, занадто багатослівні на мій смак.
Посібник по JavaFX CSS можна знайти тут .
Макет
JavaFX надає ряд панелей компонування, подібних до тих, які надає WPF. Я помітив одну відмінність у тому, що договір про міру та макет визначається далі за ланцюгом спадкування у Region
класі.
Як вже було сказано раніше, макет не може бути здійснений за допомогою CSS, але може бути виражений за допомогою коду, FXML або створений за допомогою конструктора сцени (який в кінцевому підсумку перетворюється на FXML).
Управління
JavaFX забезпечує постійно зростаючу бібліотеку елементів управління, яких ми очікували. Одна з головних відмінностей між JavaFX та WPF полягає в тому, що елементи керування - це по суті чорні скриньки і їх не можна повторно шаблонувати так, як можуть керувати WPF. Вони також здаються набагато меншими властивостями, ніж елементи керування WPF.
Елементи керування піддають деяким регіонам конкретної реалізації CSS, що дозволяє націлювати на конкретні області управління ваші стилі. Це відомо як підструктура управління. EG a CheckBox
відкриває дві підструктури; поле та галочка, що дозволяють кожній частині елемента керувати незалежно. Зауважте, що як описано раніше, вигляд елемента керування можна змінити за допомогою CSS, але відчуття не може. Якщо ви не можете різко змінити спосіб TabPane
викладення його вмісту, змінюючи внутрішню панель компонування так, як це можливо з WPF TabControl
.
Незважаючи на те, що це звучить досить обмежуюче, переважним способом створення користувальницьких елементів управління в JavaFX, здається, є використання композиції по лінії, що виходить з панелі компонування, для позиціонування стандартних елементів керування та повторного стилізації їх за допомогою CSS.
Висновок
В цілому я дуже вражений тим, що JavaFX може запропонувати на даний момент. Незважаючи на те, що він зараз не розвивається настільки зрілим, як WPF, і Oracle, безумовно, підтримує це. Час покаже, успішно це чи ні.
Я рекомендую спробувати JavaFX. Прочитайте документацію і спробуйте скласти невелику програму і подивіться, що ви думаєте.
Ви також повинні перевірити FXExperience.com, який регулярно оновлюється інформацією від команди розробників.