Каркаси Java GUI. Що вибрати? Swing, SWT, AWT, SwingX, JGoodies, JavaFX, Apache Pivot? [зачинено]


228

Для Java існує досить багато фреймворків gui, але що визнано сьогоднішнім вибором?

Далі йде моє розуміння різних рамок, будь ласка, виправте мене, якщо я помиляюся. Це дуже слабко визначений набір питань, але я все ще вважаю його цінним для тих, хто думає про створення багатих додатків для gui.


AWT

Це сама основа гойдалки, вона добре спрацьовує, але не має вдосконалених компонентів. Якщо ви маєте намір створити багаті програми, AWT, мабуть, не такий шлях. Однак для менших програм gui, які не потребують розширених інтерфейсів користувача. Це може підходити ідеально, оскільки це випробувана рамка.


Гойдалка

На основі AWT, як було зазначено раніше. У дитинстві він розглядався як повільний і невдалий і змусив IBM створити SWT для Eclipse. Однак із Java 5 (або 6?) Swing став основою вибору для створення нових додатків. Гойдалка має багато багатих компонентів, але їх у деяких областях все ще бракує. Одним із прикладів є те, що не існує повнофункціонального компонента TreeTable, який може сортувати та фільтрувати / шукати.


SWT

Створений IBM для Eclipse, вони, здається, думали, що Swing на той час не підходив для Eclipse. Сам по собі досить низький рівень, і він використовує вбудовані віджети платформи через JNI. Це зовсім не пов'язано з Swing та AWT. Однак їх API дещо незграбний і не інтуїтивно зрозумілий. У них є деякі просунуті компоненти, такі як TreeTable. (але я не думаю, що вони підтримують сортування та фільтрування з поля). SWT використовує деякі вроджені прив'язки (через JNI?), І розголос в Інтернеті полягає в тому, що ця структура не повинна використовуватися в сучасних проектах. (чому ні?)


SwingX

На основі Swing і його місією є створення багатих компонентів для гойдалки. Ще в розробці. (не дуже активний.) Мають дуже гарний набір компонентів, як, наприклад, TreeTable. Але TreeTable не підтримує фільтрування та сортування, наскільки я знаю. Однак він підтримує пошук із виділенням.

Зауважте, що SwingX - це компоненти (AFAIU), які є розширеннями або композиціями існуючих компонентів Swing


JGoodies

Рамка, про яку я нічого не знаю ... У чому це сильні та слабкі сторони? Який набір Jgoodies крім решти?

JGoodies OTOH - це про PLAF та макети.


JavaFX

Останній флагман Java / Oracle. що обіцяє стати стандартом факто в розробці багатих настільних або веб-додатків.


Apache Pivot

Він надає користувальницький інтерфейс за допомогою Java2D, тим самим мінімізуючи вплив (IMO, роздутий) спадщини Swing та AWT. (@ Август Thoo)

Здається, головна увага приділяється RIA (Rich Internet applications), але, здається, вона може бути застосована і до настільних додатків. І як особистий коментар, виглядає дуже цікаво! Особливо мені подобається, що це проект apache.

https://cwiki.apache.org/PIVOT/frequently-asked-questions-faq.html


Qt Jambi

Ява-обгортка до рідної бібліотеки qt, яка написана на c / c ++. Дуже потужний, широко використовується і приймається. Має багато графічних компонентів та простий у користуванні API.

http://qt-jambi.org/


Отже, спробуйте підсумувати трохи того, що я прошу:

Скажіть, що я хотів сьогодні створити на Java настільний додаток, який включає багато вдосконалених компонентів, що мені вибрати? І чому?

Яку з цих рамок слід визнати застарілою, а яку слід визнати рамками далекого майбутнього?

Що являє собою сучасний фактичний стандарт та які інструменти ви використовуєте для створення додатків java gui?


Я можу пошкодувати, що запитав це, але я все одно намагаюся спробувати:

Кажуть, що мережа C # / має дуже гарний набір простих у використанні компонентів, які можна розгинати в будь-якому можливому напрямку. І після дослідження різних java фреймів я певною мірою не можу сказати те саме про Java. Чому це? Чому java (яка є найбільш широко використовуваною мовою програмування у світі) не має однакового набору компонентів графічного інтерфейсу?

Це лише те, що java розробила свої компоненти gui на набагато нижчому рівні, і можна написати всі ці вдосконалені компоненти, які я шукаю, але вам доведеться зробити багато, якщо не всю роботу самостійно?


Я не знав, що SWT "базується на поєднанні AWT та Swing". Це справді так? Я думав, що це чисто JNI, щоб викликати віконну систему ОС ...
Rich

@Rich О, це було сказано в одному з коментарів відповідей. Я просто припускав, що вони знають, про що говорять.
netbrain

4
Я думаю, ви плутаєте "Інструментарій інтерфейсу користувача" та "GUI фреймворк". AWT, Swing та SWT - це набори інструментів інтерфейсу, але я б точно не називав їх "рамками". Рамки засновані на заданому наборі інструментів інтерфейсу та надають клей для створення вашої програми. Спочатку слід вибрати інструментарій інтерфейсу, а потім вибрати рамку, яка працює на цьому інструментарії. FWIW, я б вибрав Swing зі своїм власним домашнім каркасом Guts-GUI :-)
jfpoilpret

1
Це майже завжди Swing vs. SWT (принаймні для мене), для невеликого порівняння ви можете перевірити Які головні речі слід знати про досвідченого програміста Java SWT, переходячи до Swing? ..
чаклун

2
JavaFX більше не є частиною SDK для попереднього перегляду, і він доступний для використання у виробництві. оновіть цю публікацію.

Відповіді:


79

Дерево рішень:

  1. Рамки, такі як Qt та SWT, потребують нативних DLL-файлів. Тож ви повинні запитати себе: чи підтримуються всі необхідні платформи? Чи можете ви упакувати рідні DLL-програми за допомогою свого додатка?

    Дивіться тут, як це зробити для SWT .

    Якщо у вас тут вибір, вам слід віддати перевагу Qt над SWT. Qt був розроблений людьми, які розуміють користувальницький інтерфейс та робочий стіл, тоді як SWT розробляється з необхідності зробити Eclipse швидшим. Це більше виправлення продуктивності для Java 1.4, ніж фреймворк інтерфейсу. Без JFace вам не вистачає багатьох основних компонентів інтерфейсу або дуже важливих функцій компонентів інтерфейсу (наприклад, фільтрація по таблицях).

    Якщо SWT відсутня необхідна вам функція, фреймворк дещо вороже розширює її. Наприклад, ви не можете розширити будь-який клас у ньому (класи не остаточні; вони просто викидають винятки, коли пакет this.getClass()не є, org.eclipse.swtі ви не можете додавати нові класи до цього пакету, оскільки він підписаний).

  2. Якщо вам потрібно рідне чисте Java-рішення, воно залишає вас з рештою. Почнемо з AWT, Swing, SwingX - Swing шляху.

    AWT застарів. Гойдалка застаріла (можливо, менше, але на Swing протягом останніх 10 років не було зроблено багато роботи). Ви можете стверджувати, що Swing було добре для початку, але всі ми знаємо, що цей код гниє. І це особливо актуально для сучасних інтерфейсів.

    Це залишає вас з SwingX. Після більш тривалого періоду повільного прогресу розвиток знову піднявся . Основним недоліком Swing є те, що він зациклюється на деяких старих ідеях, які дуже рідко кровоточать 15 років тому, але які сьогодні відчувають себе "незграбними". Наприклад, представлення таблиць підтримують фільтрування та сортування, але це все одно доведеться конфігурувати. Вам доведеться написати багато коду пластини котла, щоб отримати гідний інтерфейс, який відчуває себе сучасним.

    Ще одна слабка область - тематизація. На сьогоднішній день існує дуже багато тем. Дивіться тут для топ-10 . Але деякі - повільні, деякі - баггі, деякі - неповні. Я ненавиджу це, коли пишу користувальницький інтерфейс, і користувачі скаржаться, що щось не працює для них, оскільки вони вибрали дивну тему.

  3. JGoodies - це ще один шар поверх Swing, як SwingX. Це намагається зробити Swing більш приємним у використанні. Веб-сайт виглядає чудово. Давайте подивимось на підручник ... хм ... все ще шукаю ... затримайся. Здається, що документація на веб-сайті взагалі відсутня. Google на допомогу . Ні, ніяких корисних навчальних посібників взагалі немає.

    Я не відчуваю впевненості в рамках UI, який так намагається приховати документацію від потенційних нових шанувальників. Це не означає, що JGoodies поганий; Я просто не міг знайти нічого хорошого про це, але це виглядає приємно.

  4. JavaFX. Чудово, стильно. Підтримка є, але я вважаю, що це більше блискуча іграшка, ніж серйозна структура інтерфейсу. Це відчуття коріння у відсутності складних елементів інтерфейсу, таких як дерева таблиці. Існує компонент на веб-кайтах для відображення HTML .

    Коли він був представлений, першою моєю думкою було "п'ять років пізно". Якщо ваша мета - приємне додаток для телефонів чи веб-сайтів, добре. Якщо ваша мета - професійний настільний додаток, переконайтеся, що він забезпечує те, що вам потрібно.

  5. Зворотний. Перший раз я чув про це. Це в основному новий інтерфейс інтерфейсу, заснований на Java2D. Тому я спробував це вчора. Ні гойдалки, просто крихітний шматочок AWT ( new Font(...)).

    Моє перше враження було приємним. Існує велика документація, яка допомагає вам розпочати роботу. Більшість прикладів містять демонстрації в реальному часі (Примітка. У вашому веб-браузері має бути включена Java; це ризик для безпеки ) на веб-сторінці, щоб ви могли бачити код та отриману програму поруч.

    На мій досвід, більше зусиль спрямовується на код, ніж на документацію. Дивлячись на документи Pivot, у коді, мабуть, було витрачено багато зусиль. Зауважте, що в даний час у вашому браузері є помилка, яка перешкоджає роботі деяких прикладів ( PIVOT-858 ).

    Моє друге враження від Pivot - це те, що він простий у використанні. Коли я зіткнувся з проблемою, я зазвичай міг її швидко вирішити, переглядаючи приклад. Я не маю посилання на всі стилі, які підтримує кожен компонент.

    Як і в JavaFX, йому не вистачає деяких компонентів вищого рівня, таких як компонент таблиці дерев ( PIVOT-306 ). Я не намагався ледачого завантаження з видом таблиці. Моє враження, що якщо в базовій моделі використовується ледаче завантаження, то цього достатньо.

    Перспективний. Якщо можете, спробуйте.


Спробував демонстрацію Pivot "Кухонна мийка", після відкриття деяких груп він продовжує їсти весь процесор. Якщо це стосується дизайну Pivot, то я його точно не хочу в своїх проектах.
Відображення імені

Здається, я знайшов джерело проблеми, і вона виправлена ​​в пізніших версіях: apache-pivot-users.399431.n3.nabble.com/…
Відображення імені

2
JavaFX 8 (для Java 8 і вище) має віджет TreeTableView. Тим НЕ менше, JavaFX 2.2 (для Java 7) не вистачає цього, а також не вистачає стандартних помилок і інформація dialgos: см stackoverflow.com/a/12760202/105137 . Також бібліотека віджетів ControlsFX доступна лише для Java 8: fxexperience.com/controlsfx
kostmo

12

SWT сам по собі досить низький рівень, і він використовує вбудовані віджети платформи через JNI. Це зовсім не пов'язано з Swing та AWT. Eclipse IDE і все Eclipse , на основі багатих клієнтських додатків , як клієнт Vuze BitTorrent , будуються з використанням SWT. Крім того, якщо ви розробляєте плагіни Eclipse, ви зазвичай використовуєте SWT.
Я розробляю програми та плагіни на основі Eclipse вже майже 5 років, тому я чітко упереджений. Однак я також маю великий досвід роботи з SWT та інструментарієм JFace UI, який будується поверх нього. Я визнав JFace дуже багатим і потужним; в деяких випадках це може бути навіть основною причиною вибору SWT. Це дає змогу досить швидко підключити робочий інтерфейс користувача, якщо він схожий на IDE (з таблицями, деревами, нативними елементами управління тощо). Звичайно, ви можете також інтегрувати свої власні елементи керування, але це потребує додаткових зусиль.


На вашу думку, чи може розширений компонент, такий як TreeTable із сортуванням та фільтруванням стовпців, бути великою проблемою для SWT + JFace?
netbrain

@netbrain: Я це робив уже не раз, це досить просто з JFace. Це те, що я мав на увазі під "IDE-подібним" інтерфейсом, можливо, не найкращий вибір слів.
Zsolt Török

9

Я хотів би запропонувати інший фреймворк: Apache Pivot http://pivot.apache.org/ .

Я спробував це коротко і був вражений тим, що він може запропонувати як RIA (Rich Internet Application) рамки ala Flash.

Він надає користувальницький інтерфейс за допомогою Java2D, тим самим мінімізуючи вплив (IMO, роздутий) спадщини Swing та AWT.


1
У мене склалося враження, що Netbrain питає про настільні додатки. Для рамок RIA врахуйте також GWT та Vaadin. Ці рамки дозволяють писати на Java, компілювати та отримувати JavaScript, який дуже добре працює у всіх звичайних веб-браузерах.
Костіс Айваліс

не можна застосувати шарнірно для настільних програм?
netbrain

Можливо, це питання визначення, але рамки RIA в основному розроблені для роботи в браузерах.
Costis Aivalis

2
@netbrain: Так, ви можете запустити Pivot як настільний додаток (JFrame) або аплет (JApplet).
Augustus Thoo

9

Swing + SwingX + Miglayout - це моя комбінація на вибір. Miglayout настільки простіший, ніж Swings сприйняв 200 різних менеджерів макетів і набагато потужніший. Також він надає вам можливість "налагоджувати" свої макети, що особливо зручно при створенні складних макетів.


8

Ще один варіант - використовувати Qt Jambi . Він має майже всю велич Qt (багато компонентів, хороша документація, простий у користуванні), без клопоту на C ++. Я використовував це 3-4 роки тому для невеликого проекту, навіть тоді він був майже зрілим.

Ви можете побачити дискусію про Swing vs. Qt тут .


5

Моя особиста думка: Ідіть на Swing разом з платформою NetBeans.

Якщо вам потрібні вдосконалені компоненти (більше, ніж пропонує NetBeans), ви можете легко інтегрувати SwingX без проблем (або JGoodies), оскільки платформа NetBeans повністю базується на Swing.

Я б не запускав великий настільний додаток (або той, який буде великим) без хорошої платформи, яка будується на основі основної системи інтерфейсу.

Інший варіант - SWT разом з Eclipse RCP, але важче (хоча і не неможливо) інтегрувати «чисті» компоненти Swing у такий додаток.

Крива навчання трохи крута для платформи NetBeans (хоча, мабуть, це справедливо і для Eclipse), але є кілька хороших книг, навколо яких я б дуже рекомендував.


1
Зауважте, що SwingX - це компоненти (AFAIU), які є розширеннями або композиціями існуючих компонентів Swing. JGoodies OTOH - це про PLAF та макети. Але, як ви вже сказали, будь-який інтегрується з Swing.
Ендрю Томпсон

1
+1 Базуйте свою розробку на Swing. Гойдалка побудована поверх AWT і включає легкі компоненти, які виглядають та поводяться однаково на всіх платформах, тому ніколи не слід використовувати компоненти AWT безпосередньо. Існує велика кількість відмінних бобів, які ви можете легко додати до свого графічного інтерфейсу розвитку, наприклад, JCalendar toedter.com.
Костіс Айваліс

1
@Andrew, крім PLAF та верстки, JGoodies пропонує ще: прив'язування бобів (для моделі презентаційної моделі), перевірку та рамку "схожий на JSR-296" (ця є комерційною).
jfpoilpret

3

ви забули для Java Desktop Aplication на базі JSR296 як вбудованої структури Swing в NetBeans

виключаючи AWT та JavaFX, всі ваші зневірені рамки базуються на Swing, якщо ви почнете з Swing, тоді ви зрозумієте (чітко) для всіх цих Swing (на основі фреймів)

ATW, SWT (Eclipse), додатки на робочому столі Java (Netbeans), SwingX, JGoodies

всі рамки існують (я нічого не знаю про JGoodies) в т.ч. JavaFX не давно просунувся, безліч базових фреймворків Swing зупиняються, якщо не тоді без новітньої версії

просто мій погляд - найкращий з них - SwingX, але потрібні найглибші знання про Swing,

Подивіться і відчуйте основи Swing


частина з них на компонентах AWT, частина на Swing JCompoentns, але між AWT та Swing - це різниця між реалізованими, доступними та успадкованими методами, наприклад, Swing JComponents безпосередньо (API) реалізує безліч успадкованих або вкладених методів безпосередньо від AWT :-)
mKorbel

JSR296 мертвий. Він більше не підтримується, і підтримка його була видалена з NetBeans. (І це ніколи не було справді хороших рамок для початку)
a_horse_with_no_name

@a_horse_with_no_name право with same progressв SWT, SwingX, новий власник, нові манієри
mKorbel

1
SWT, розроблений IBM, не базується на Swing, це / була конкурентоспроможною технологією. Swing використовує AWT. JavaFX також не базується на Swing. Це абсолютно нові рамки. Деякі називають це спадкоємцем Swing, але це все ще занадто незріло, щоб називати цю битву. Я приймаю саме таке рішення на даний момент, і Swing - мій кандидат, просто за те, що це найзріліший, але реалістичний варіант.
Гордон

1
SwingX - це розширення для Swing (саме тому він вимагає знань Swing). Насправді, деякі функції SwingX були перенесені в сам Swing.
Гордон

3

Я був дуже задоволений Swing для настільних додатків, в яких я брав участь. Однак я поділяю вашу думку щодо того, що Swing не пропонує розширені компоненти. Що я робив у цих випадках - це йти на JIDE. Це не безкоштовно, але і не так дорого, і це дає вам набагато більше інструментів під поясом. Зокрема, вони пропонують фільтрується TreeTable.


Добре знати! Тож JIDE створив власні компоненти на базі Swing ...
netbrain

Так, JIDE створив досить багато компонентів, що охоплюють сітки, дерева, таблиці, графіки тощо. Як я вже говорив, це не безкоштовно, але враховуючи час, який знадобиться, щоб зробити ці речі самостійно, можливо, краще використовувати щось, що вже зроблено. Крім того, наскільки я розумію, JIDE є гнучким щодо дозволу проектам з відкритим кодом використовувати їх компоненти в обмін на посилання на свій веб-сайт або логотип у діалоговому вікні "Про".
sbrattla

3

Я б поїхав з Swing. Для компонування я б використовував макет форми JGoodies. Варто вивчити Білу книгу про макет форми тут - http://www.jgoodies.com/freeware/forms/

Крім того, якщо ви збираєтеся розпочати розробку величезного настільного додатка, вам обов'язково знадобиться рамка. Інші вказали на структуру мережевих бобів. Мені це не сподобалось, тому я написав нове, яке ми зараз використовуємо у моїй компанії. Я поставив це на sourceforge, але не знайшов часу, щоб багато чого документувати. Ось посилання для перегляду коду:

http://swingobj.svn.sourceforge.net/viewvc/swingobj/

Вітрина повинна показати вам, як зробити просту реєстрацію насправді ..

Дайте мені знати, якщо у вас є якісь запитання щодо цього, я можу допомогти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.