Як JavaFX порівнюється з WPF? [зачинено]


93

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

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

Оскільки я дуже добре знайомий з C # і WPF, я хотів би зрозуміти, наскільки дві технології схожі чи різні.

EDIT: Бачачи, що відповіді не буде, я спробую бути більш конкретним:

  1. WPF використовує XAML для створення візуального дерева, чи має JavaFX щось подібне?
  2. WPF найкраще використовувати при прив’язці до моделі перегляду у шаблоні MVVM, чи JavaFX також широко використовує прив'язку?
  3. WPF використовує GPU для візуалізації, чи робить JavaFX те саме?
  4. Як Silverlight порівнюється з JavaFX при запуску через браузер на мережевому ПК?

... Більше ...

Я змінюю це на вікі спільноти, щоб порівняння могли оновлюватись (сподіваємось).


7
Смішно, що питання з 83 авансами можна вважати неконструктивним.
Крістіанп

Відповіді:


120

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


9
Дякую за це, це дуже виховує. Якщо ви могли б додатково покращити цю відповідь, просуваючись далі у своїх знаннях JavaFX, це було б приголомшливо.
Aviad P.

5
Мені також сподобалося читати вашу відповідь, і я хотів би почути більше, якщо ваша робота з JavaFX виявить подальшу думку.
Пол-Себастьян Маноле

21

Я думаю, що найкращий спосіб відчути 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, рамки аплетів Java були перероблені, і хоч це не так просто, як Adobe Flash, він значно вдосконалений. Я не впевнений, як це порівнювати із Silverlight, крім того, що у мене виникли проблеми з тим, щоб Silverlight працювати на Linux, але JavaFX працював над Linux.

Ось ще одне пов'язане питання .


15
Ця відповідь застаріла, оскільки JavaFX зазнав значних оновлень у Java 7. Дивіться тут .
Золтан

7
Ви впевнені, що JavaFX використовує swing та AWT? Я вважаю, що він має свій двигун візуалізації, який називається призмою. Під час запуску програми JavaFX не створюється жодна тема диспетчеризації подій.
Енді до
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.