Які найкращі практики розробки Java Swing?


17

Роблячи моє попереднє дослідження з цього питання , я виявив, що в Інтернеті не так багато добре організованої інформації про найкращі практики Java Swing. Тож я думаю, що я дам Stack Exchange зняти знімок, щоб створити той великий список.

Які найкращі практики розробки Java Swing? Що ви виявили, що працює для вас, і чому?


2
Я зі школою грав у Swing, і це було не приємне враження. Вся справа здавалася роздутою і надмірно складною. Найкращою практикою може бути використання чогось іншого.
Роберт Харві

1
@RobertHarvey "грати в школі" - це далекий від доставки виробничого програмного забезпечення. Я виявив, що Swing може зробити все, що від нього потрібно, розумним, логічним способом.

Ну, кажучи так: Якби це було складним для простого шкільного проекту, це було б майже немислимо складним на реальному.
Роберт Харві

1
@RobertHarvey потужність поставляється з ціною ...

Ще одна важлива річ. Компоненти гойдалок серіалізуються і мають багатьох предків. Тому вони надто важкі, щоб успадковувати їх у більшості випадків. Ви повинні врахувати деяку техніку обгортання, особливо коли у вас нестерилізаційний стан. Якщо ви успадковуєте компонент, просто використовуйте його як перегляд (у MVC чи подібній схемі).
Давид Хорват

Відповіді:


12

Я можу відповісти лише за те, що працювало на мене. Інші коментатори зазначають, що графічні інтерфейси Java взагалі потрапляють у «дивну долину» не зовсім рідного вигляду та почуття, і я не заперечую з цим.

Корисно використовувати API дій. Це дозволяє краще інкапсулювати різні дії, які виконує ваш користувач, і дозволить вам набагато легше підключити їх до ярликів, клавіш акселератора, кнопок та інших об'єктів введення.

Використовуйте відповідний менеджер компонування. GridBagLayout надзвичайно потужний, але я б пішов так далеко, щоб сказати, що це неможливо без зайвої кількості коментарів. Коли я запускаю інструменти аналізу статичного коду, такі як Sonar, над старішим додатком GUI, який я підтримую, він завжди вказує на величезні кількості магічних чисел, щоб зробити макет GridBags правильним. Я мав багато успіхів з GroupLayout, що дозволяє уникнути необхідності вирівнювання пікселів.

Якщо ви думаєте, що вам потрібен JDialog ... ви, мабуть, цього не робите. Діалогові вікна є жахливими, з точки зору досвіду користувачів - ця програма вирішила використовувати їх для кожного меню та форми, а також виконувати правила завжди на вершині химерними способами. Це перетворилося на кошмар технічного обслуговування, коли нам насправді потрібно було щось попередити через меню. Cue розчарував клацання на нефокусованих - і, таким чином, неприпустимих - діалогах.

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

Це все, що я можу запропонувати, за своїм досвідом обмеженим досвідом.


2
JDialogідеально добре - поки ви використовуєте його для діалогів.
Йонас

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

@Jonas Я думаю, що справа в тому, що діалоги - це погана річ (незалежно від того, реалізовано вони це JDialogчи ні).
Том Хотін - тайклін

1
З'єднання трохи на смердючій стороні, але це краще ІМО, ніж написання власного коду для нарізки. Я б краще розібрався з неелегантним кодом, ніж непомітні помилки потоків.
Том Г

3
Ви можете подивитися на MigLayout - miglayout.com

4

Я б сказав, що одна з перших речей - це не працювати над цим безпосередньо. Система компонування в Swing (IMHO) жахлива, і намагатися зробити з неї будь-яке істотне додаток - це кошмар.

Два з багатьох альтернативних менеджерів компонування, які я використовував, - це MigLayout та MultiSplitPane. MigLayout має більш загальне призначення і робить будь-який макет, про який ви можете придумати, легким, здоровим способом. MultiSplitPane є більш конкретним; Я використовував його для створення простих макетів для графічних інтерфейсів, які не мали великої складності.

EDIT : Це не замінює гойдалки . Якщо вам доведеться використовувати Swing, ви все одно можете використовувати ці менеджери макетів, оскільки вони керують лише swing, а не замінюють його.


Звичайно, краща альтернатива - просто не використовувати Swing. Гойдалки гостро критикують за те, що вони жахливо працюють, не виглядають рідними та повільними. Існує багато альтернатив, які навчилися з того, що не робити, як Qt, SWT, і я думаю, навіть GTK. Це чудові довгострокові рішення головного болю Swing

EDIT : Як сказав @Lord Torgamus, вони насправді недоступні, якщо ваші змушені використовувати Swing. Якщо ви збираєтеся використати ці можливості, щоб це вирішити під час створення проекту, а не 3/4 - це шлях через або під час переробки застарілих додатків.

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


4
Я вдячний за вашу думку, але "не використовуйте Swing" не допомагає людям, які стикаються з цим питанням, оскільки вони з тих чи інших причин змушені використовувати Swing.
Попс

@Lord Ось чому я запропонував альтернативні менеджери компонування, перш ніж запропонувати QT та SWT. Використовуйте будь-який шлях.
TheLQ

"Система компонування в Swing (IMHO) жахлива, і намагатися зробити з неї будь-яке істотне додаток - це кошмар." Менеджери макета, як правило, походять від AWT, а не від Swing. Звичайно, існує декілька конкретних Swing, таких як BoxLayout та GroupLayout. Сказавши це, менеджери макетів є абсолютно необов'язковими ... замість цього ви можете вказати координати для кожного компонента так само, як у .NET WinForms (крім .NET має гарний графічний інтерфейс, щоб зробити це за вас).
Powerlord

3
Подивіться на MigLayout - miglayout.com

1
@TheLQ Гаразд Я погоджуюся з файловим менеджером Swing, що той справді дурний (і на Mac OS X). У будь-якому випадку я просто використовую менеджер файлів AWT, щоб виправити це. Добре працює, навіть якщо решта програми зроблена за допомогою Swing.
stommestack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.