Використання декількох фреймів JF: хороша чи погана практика? [зачинено]


531

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

Мені просто цікаво, чи правильно використовувати декілька вікон JFrame?


11
Тільки якщо ви орієнтуєтесь на налаштування на кілька моніторів!
ДНК

17
Я також зауважу, що це мова-агностик і має більше стосунку до інтерфейсу користувача, ніж конкретно до Java.
wchargin

6
Я погодився б із цим @WChargin Це питання стало більш цінним, ніж я коли-небудь думав, що міг!
Педлер

1
Я помічаю, що початківці (такі як я) зазвичай використовують кілька JFrames. Можливо, тому, що його легше викликати зсередини основної JFrame, ніж використовувати, скажімо, CardLayout. Хоча в деяких випадках використовувати його не доцільно.
Hoodlum

Налагодження було б як їсти кактус .. це не доцільно.
Таслім Осені

Відповіді:


447

Мені просто цікаво, чи правильно використовувати декілька JFrames?

Погана (погана, погана) практика.

  • Непривітний для користувачів: Користувач бачить кілька значків на панелі завдань, коли очікує побачити лише одну. Плюс побічні ефекти проблем кодування ..
  • Кошмар, щоб кодувати і підтримувати:
    • Модальний діалог пропонує легку можливість зосередити увагу на зміст цього діалогу - вибрати / виправити / скасувати це, потім продовжити. Кілька кадрів цього не роблять.
    • Діалогове вікно (або плаваюча панель інструментів) з батьком вийде на перший план при натисканні на батьків - вам доведеться реалізувати це у кадрах, якби це було бажане поведінка.

Існує будь-яка кількість способів відображення багатьох елементів в одному графічному інтерфейсі, наприклад:

  • CardLayout(коротка демонстрація. ) Добре для:
    1. Показ майстра на зразок діалогів.
    2. Відображення вибору списку, дерева тощо для елементів, які мають пов'язаний компонент.
    3. Переміщення між відсутністю компонента та видимим компонентом.
  • JInternalFrame/JDesktopPane зазвичай використовується для ІРС .
  • JTabbedPane для груп компонентів.
  • JSplitPane Спосіб відображення двох компонентів, значення яких між тим чи іншим (розмір) змінюється залежно від того, що робить користувач.
  • JLayeredPane набагато багато .. шаруватих компонентів.
  • JToolBarзазвичай містить групи дій або елементів управління. Можна перетягувати навколо GUI або виключати його повністю відповідно до потреб користувача. Як було сказано вище, мінімізувати / відновити відповідно до батьків.
  • Як елементи в JList(простий приклад нижче).
  • Як вузли в а JTree.
  • Вкладені макети .

Але якщо ці стратегії не працюють для конкретного випадку використання, спробуйте наступне. Встановіть єдине головне JFrame, потім з'явіться JDialogабо JOptionPaneекземпляри для решти вільно плаваючих елементів, використовуючи кадр як батьківський діалог.

Багато зображень

У цьому випадку, коли декілька елементів є зображеннями, було б краще використовувати один із наведених нижче:

  1. Єдиний JLabel(в центрі області прокрутки) для відображення того зображення, яке зацікавило б користувача в цей момент. Як видно в ImageViewer.
  2. Єдиний ряд JList. Як видно з цієї відповіді . Частина "єдиного ряду" працює лише тоді, коли вони мають однакові розміри. Крім того, якщо ви готові масштабувати зображення під час руху, і всі вони мають однакове співвідношення сторін (наприклад, 4: 3 або 16: 9).


4
@AndrewThompson Я ніколи не стикався з ситуацією, коли мені потрібні були декілька JFrames раніше, і ніколи не розглядав ці проблеми, дякую за пояснення!
Джефрі

4
@ user417896 "Просто залежить". Ні, це не так. Я використовував Gimp. Це жахливо і має бути MDI.
Ендрю Томпсон

4
@ryvantage "Чи повинен (Excel) бути MDI?" Хороше питання. Я вважаю, що його слід пропонувати користувачеві обома способами (звичайно, не лише у формі MDI). Наприклад: 1) В даний час я використовую TextPad, і за конфігурацією на мій вибір він відкриває окремі екземпляри, що кожен пропонує декілька документів, показаних у списку. 2) Хоча я зазвичай використовую FF у вкладці, інколи перетягую вкладку до нового вікна. - Загальним фактором у прикладах є вибір користувача. Доставте додаток. "однак користувач хоче цього".
Ендрю Томпсон

12
@AndrewThompson Ви щойно протиставили свій власний аргумент своїм останнім коментарем. У своїй головній відповіді ви говорите, що це погана практика і цього ніколи не слід робити, але у своєму коментарі вище ви говорите, що вам іноді подобається SDI, і ми повинні запропонувати нашим користувачам вибір. Звичайно, саме так говорив user417896 вище. Це залежить. Це одна з моїх найбільших ненавистей до домашніх тварин щодо моїх колег-розробників. Той факт, що багато з них стають релігійно фанатичними щодо так званих «найкращих практик». У нас не було б інноваційних інтерфейсів, які ми маємо сьогодні, якби ми всі дотримувались «найкращих практик» і не думали поза площею.
DuncanKinnear

4
Величезне узагальнення! ЗАВЖДИ не погано дозволяти користувачеві керувати своїми вікнами окремо та отримувати доступ до них індивідуально з панелі завдань. Доброю практикою є усвідомлення всіх варіантів та розумний вибір одного з них. Звичайно, є випадки, коли кілька JFrames мають багато сенсу.
Dawood ibn Kareem

203

Багаторазовий JFrameпідхід - це те, що я реалізував з моменту початку програмування додатків Swing. Здебільшого я це робив на початку, тому що не знав нічого кращого. Однак , як я дорослий у своєму досвіді та знаннях як розробник, і коли почав читати та поглинати думки багатьох більш досвідчених Java-розробників в Інтернеті, я зробив спробу відійти від багаторазового JFrameпідходу (як у поточних проектах, так і в майбутніх проектах ) тільки для того, щоб зустрітися з ... отримати цей ... опір моїх клієнтів! Коли я почав впроваджувати модальні діалоги для управління «дочірніми» вікнами та JInternalFrames для окремих компонентів, мої клієнти почали скаржитися!Я був дуже здивований, як робив те, що вважав найкращим практиком! Але, як кажуть, "Щаслива дружина - це щасливе життя". Те саме стосується і ваших клієнтів. Звичайно, я підрядник, тому мої кінцеві користувачі мають прямий доступ до мене, розробника, що, очевидно, не є загальним сценарієм.

Отже, я збираюся пояснити переваги багаторазового JFrameпідходу, а також міф про перенапруження деяких мінусів, які представили інші.

  1. Кінцева гнучкість у компонуванні - Дозволяючи окремим JFrames, ви даєте кінцевому користувачеві можливість розповсюджуватись та контролювати те, що на його / її екрані. Концепція відчуває себе "відкритою" і не обмежує. Ви втрачаєте це, коли йдете назустріч одній великій JFrameі купі JInternalFrames.
  2. Добре працює для дуже модульованих програм - У моєму випадку більшість моїх додатків мають 3–5 великих «модулів», які насправді не мають нічого спільного між собою. Наприклад, один модуль може бути інформаційною панеллю продажів, а один - інформаційною панеллю бухгалтерського обліку. Вони не розмовляють між собою чи ні про що. Однак виконавчий директор може захотіти відкрити і те, і це, оскільки окремі кадри на панелі завдань полегшують його життя.
  3. Кінцевим користувачам полегшується посилання на зовнішній матеріал - Одного разу у мене виникла така ситуація: у моєму додатку було "переглядач даних", з якого можна було натиснути "Додати нове", і це відкриє екран для введення даних. Спочатку обидва були JFrameс. Однак я хотів, щоб на екрані введення даних JDialogбув батько, чиїм батьком був переглядач даних. Я вніс зміни, і одразу отримав дзвінок від кінцевого користувача, який сильно покладався на те, що він може мінімізувати або закрити глядача та тримати редактор відкритим, поки він посилається на іншу частину програми (або веб-сайт, я не хочу не пам’ятаю). Він не на мультимоніторі, тому йому потрібен був діалог вступу, щоб бути першим та чимось іншимпо-друге, із засобом перегляду даних повністю прихованим. Це було неможливо з a, JDialogі, звичайно, було б неможливо і з JInternalFrame. Я зневажливо змінив його назад, щоб він був відокремленим JFramesза його розум, але це навчило мене важливого уроку.
  4. Міф: Важко кодувати - Це не так у моєму досвіді. Я не розумію, чому було б легше створити, JInternalFrameніж а JFrame. Насправді, на мій досвід, JInternalFramesпропонуйте набагато меншу гнучкість. Я розробив систематичний спосіб роботи з відкриттям і закриттям JFrames у своїх додатках, який справді добре працює. Я керую кадром майже повністю з самого коду кадру; створення нового кадру, SwingWorkerякий контролює пошук даних у фонових потоках та GUI-коді на EDT, відновлення / виведення на фронт кадру, якщо користувач намагається відкрити його двічі і т. д. Все, що вам потрібно, щоб відкрити мій JFrames - це виклик публічного статичного методу open()та відкритого методу в поєднанні з awindowClosing() подія обробляє решту (чи вже кадр відкритий? він не відкритий, але завантажується? тощо). Я зробив цей підхід шаблоном, тому його не важко реалізувати для кожного кадру.
  5. Міф / недоведений: ресурс важкий - я хотів би побачити деякі факти, що стоять за цим умоглядним твердженням. Хоча, можливо, ви могли б сказати, що JFrameпотрібно більше місця, ніж а JInternalFrame, навіть якщо ви відкриєте 100 JFrameс, скільки ще ресурсів ви б насправді споживали? Якщо ваше занепокоєння є витоком пам’яті через ресурси: виклик dispose()звільняє всі ресурси, які використовує кадр для збору сміття (і, знову ж таки, я кажу, a JInternalFrameповинен викликати саме таку проблему).

Я багато писав і відчуваю, що можу написати більше. У будь-якому випадку, я сподіваюся, що я не отримаю голосу просто тому, що це непопулярна думка. Питання явно цінне, і я сподіваюся, що я дав цінну відповідь, навіть якщо це не є загальною думкою.

Чудовим прикладом декількох кадрів / одного документа на кадр ( SDI ) проти одного кадру / декількох документів на кадр ( MDI ) є Microsoft Excel. Деякі переваги MDI:

  • можливо мати кілька вікон у прямокутній формі - щоб вони не приховували робочий стіл чи інше вікно від іншого процесу (наприклад, веб-браузера)
  • можливо відкрити вікно з іншого процесу над одним вікном Excel під час запису у другому вікні Excel - за допомогою MDI, намагаючись записати в одне із внутрішніх вікон, буде зосереджено все вікно Excel, отже, приховування вікна від іншого процесу
  • можна мати різні документи на різних екранах, що особливо корисно, коли екрани не мають однакової роздільної здатності

SDI (інтерфейс з одним документом, тобто кожне вікно може мати лише один документ):

введіть тут опис зображення

MDI (Інтерфейс з декількома документами, тобто кожне вікно може мати декілька документів):

введіть тут опис зображення


16
Добре продуманий. Якщо у вас є кілька модулів, які не мають нічого спільного між собою, чому б не створити окремі додатки? Крім того, немає обмежень, що говорять про те, що вам потрібно використовувати модальні діалоги, ви можете використовувати безмодельні діалоги, щоб служити другим "кадром".
Джефрі

Дуже хороша відповідь та детальна відповідь, хоча на цьому я маю згоду з @kleopatra. У мене колись була програма із понад сотнею екранів, де користувачі хотіли порівнювати вихідні дані з декількох екранів / одного екрана з різними входами. Ми створили власну систему вікон, щоб нам це зробити. Користувачам було просто зручніше мати 2 JFrames, щоб триматися поруч;)
javatarz

Поки я розумію ваш аргумент, я все-таки вважаю за краще мати все в одному JFrameі великому батьківському JTabbedPane; але з можливістю відкрити друге вікно (або навіть більше), де макет може бути різним, пропонуючи таким чином гібридну поведінку, коли любителі SDI щасливі та MDI. У всіх випадках я завжди розглядав JInternalFrameжахливий зразок, який доставляє вам всі незручності обох світів. Гнучкість, яку вони пропонують, просто гасить, і вони з'їдають багато дорогоцінного екранного простору без реальних цілей.
Гійом Полет

Я погоджуюся, що SDI іноді доречний (і користувачі часто віддають йому перевагу). Є ще один недолік, і я поки що не знайшов вирішення цього питання, на жаль, кожен JFrameотримує свій значок панелі завдань. Іноді це саме те, що ти хочеш, але іноді це не так. У WinAPI це легко налаштувати, але в Swing здається, що це неможливо зробити.
Сума

@suma в такому випадку я думаю, що я обрав би JDialogбільше JFrame.
ryvantage

51

Я хотів би протиставити аргумент "непривітний до користувачів" із прикладом, з яким я щойно брав участь.

У нашому додатку у нас є головне вікно, де користувачі виконують різні 'програми' як окремі вкладки. Наскільки це можливо, ми намагалися зберегти наше додаток до цього єдиного вікна.

Одна з «програм», яку вони виконують, представляє список звітів, створених системою, і користувач може натиснути на піктограму в кожному рядку, щоб відкрити діалогове вікно перегляду звітів. Цей глядач показує еквівалент портретної / альбомної сторінки формату A4 у звіті, тому користувачам подобається, що це вікно є досить великим, майже заповнюючи свої екрани.

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

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

Вони відкривали програму перегляду, використовуючи інструмент "Зберегти як", щоб зберегти звіт як PDF у певний каталог, використовуючи програму Acrobat Reader, щоб відкрити файл PDF, і тоді вони зробили б те саме з наступним звітом. У них було б кілька читачів Acrobat, які працюють із різними результатами звітів, які вони хотіли переглянути.

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

Коли остання версія була випущена їм минулого тижня, переважна відповідь від них полягає в тому, що вони ЛЮБИТЬ її. Це одне з найпопулярніших останніх удосконалень у системі.

Тож ви продовжуєте і кажете своїм користувачам, що те, що вони хочуть, є поганим, але в кінцевому рахунку це не принесе вам ніяких прихильностей.

ДЕЯКІ ПРИМІТКИ:

  • Здається, найкраща практика використовувати JDialog для цих безмобільних вікон
  • Використовуйте конструктори, які використовують новий, ModalityTypeа не булевий modalаргумент. Саме це дає цим діалогам значок панелі завдань.
  • Для діалогових діалогових режимів переведіть конструктор нульових батьків, але знайдіть їх відносно вікна "батьків".
  • У версії 6 Java для Windows є помилка, що означає, що ваше головне вікно може стати "завжди зверху", не повідомляючи про це. Перейдіть до версії 7, щоб виправити це

6
Це саме мій досвід. Якщо я впевнений у одній речі, це те, що ви робите щось не так, коли люди намагаються обійти вашу зручність, щоб зробити все, що вони дійсно хочуть зробити. Функціональність - король.
ryvantage

Один із способів обійти це - дозволити відкриття декількох JFrame, які пропонують однаковий функціонал, але за замовчуванням все робиться в одному вікні. Це фактично дозволяє користувачеві вибирати між SDI або MDI.
Гійом Полет

Вибачте? Чи можете ви пояснити своє рішення трохи краще, будь ласка? Як це може бути одне вікно І кілька вікон? У нас є одне головне вікно, де працює головна програма, але іноді нам потрібно відкрити діалоги, а іноді ці діалоги (засновані на вимогах користувачів) повинні бути без режиму. Сформулюйте правила, що інтерфейс повинен бути таким, або що просто збираєтеся викопати велику яму для себе.
DuncanKinnear

1
@GuillaumePolet Я погоджуюся з Duncan, чи можете ви пояснити, що ви маєте на увазі трохи більше? Я ділюсь його плутаниною
Ungeheuer

Я думаю, що він має на увазі те, що користувач може запустити кілька копій програми ("JFrame"), але всередині цього SDI. Однак наш клієнтський додаток є дуже товстим клієнтом, тому це було б підходом до ресурсів.
DuncanKinnear

20

Зробіть jInternalFrame в основний кадр і зробіть його невидимим. Тоді ви можете використовувати його для подальших подій.

jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);

19

Минуло час, коли я останній раз торкаюся гойдалки, але загалом це погана практика. Деякі основні недоліки, які виникають на увазі:

  • Це дорожче: вам доведеться виділити набагато більше ресурсів, щоб намалювати JFrame такий інший тип віконного контейнера, як Dialog або JInternalFrame.

  • Не зручно для користувачів: Непросто орієнтуватися на купу злитого JFrame, це буде виглядати так, що ваша програма - це набір програм, несумісних та погано оформлений.

  • Використовувати JInternalFrame дуже просто. Це дуже просто, але тепер простіше, а інші люди розумніші (або з більшим вільним часом), ніж ми вже продумували шаблон робочого столу та JInternalFrame, тому я рекомендую використовувати його.


7
Хіба ви не маєте однакового ефекту для користувача і при використанні кількох JInternalFrame? Особисто я не погоджуюся з використанням JInternalFrame's! CardLayoutце справжнє благо!
Бранислав Лазіч

4
Я згоден з @ brano88. JInternalFrameне має жодних переваг у жодному з трьох згаданих вами випадків (1. де свідчення JInternalFrameлегші, ніж JFrame? 2. Ваші особи JInternalFrameможуть бути такими ж захаращеними / брудними / склеєними, як купа JFrameс. 3. Як JInternalFrameлегше? Це той самий точний код, за винятком того, що він міститься в межах, JDesktopPaneа один міститься в межах природного екрана. Вони звучать для мене однаково складно.)
ryvantage

1
1. JFrame - це ваговий компонент порівняно з JInternalFrame, який є легким. 2. Ви коли-небудь бачили додаток, який одночасно містить багато вікон, щоб бути функціональним? IDE, браузери, навіть у застосуванні до фінансів - це мета тримати його в тому ж масштабі. 3. Я вважав, що JIF був дуже простим у використанні в минулому, і не маю нарікань, звичайно, виберіть компонент, який найкраще відповідає сценарію
Necronet

4
1. Я хотів би бачити докази цього. Обидва є об'єктами, обидва - JComponents, обидва мають майже однакові структури, за винятком того, що одна зображена на a, JDesktopа одна - ні. Знову вибачте, але я вважаю, що ви спекулюєте щодо "ваги" JFrame. 2. Мої програми використовують SDI, і мої клієнти дуже раді. Однак ви сказали "тонну вікон", яка, звичайно, смоктала б. Але, моя думка така: "тонну" JInternalFrameвисмоктали б так само погано! Якщо ви говорите, що JIF дозволяють вам бути неохайним дизайнером інтерфейсу користувача, то це жахливо. Забруднений безлад - це захаращений безлад, будь то JF чи JIF.
ryvantage

2
"Звичайно, виберіть компонент, який найкраще відповідає сценарію"
Necronet

10

Погана практика, безумовно. Однією з причин є те, що це не дуже "зручно" для того, що кожен JFrameпоказує новий значок панелі завдань. Якщо керувати кількома JFrameелементами, ви змурите волосся.

Особисто я хотів би використовувати ОДИН JFrameдля вашого типу додатків. Методів відображення кількох речей залежить від вас, існує багато. Canvasес, JInternalFrame, CardLayoutнавіть JPanelS можливо.

Кілька об'єктів JFrame = Біль, неприємності та проблеми.


9
хм ... нічого нового в порівнянні з прийнятою відповіддю, афаїки?
Клеопатра

5
"Кожен JFrame показує новий значок панелі завдань" - це стосується лише Windows! У Mac OS X кожна програма містить лише одну піктограму дока, незалежно від кількості вікон, у яких вона відкрита, і для додатків прийнято мати декілька вікон верхнього рівня.
Рольф

8

Я думаю, що використовувати кілька Jframes - це не дуже гарна ідея.

Натомість ми можемо використовувати JPanels більше ніж одне чи більше JPanelв одному і тому ж JFrame.

Також ми можемо перемикатися між цим JPanels. Таким чином, це дає нам свободу відображати більше, ніж на речі в JFrame.

Для кожного JPanelми можемо розробити різні речі, і все це JPanelможе відображатися по одній окремо JFrame.

Для перемикання між цим JPanelами використання JMenuBarз JMenuItemsдля кожного JPanelабо «JButton for eachJPanel`.

Більше одного JFrameне є хорошою практикою, але немає нічого поганого, якщо ми хочемо більше одного JFrame.

Але краще змінити один JFrameдля наших різних потреб, а не мати кілька JFrames.


5

Якщо кадри будуть однакового розміру, чому б не створити кадр і передати кадр тоді як посилання на нього.

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


1
Це, в основному, те, що можуть робити Cardlayout і JTabbedPane, але робити це в зворотному порядку і робити ваш код надто складним, тоді як у вас є чисте і просте рішення для досягнення того ж самого.
Гійом Полет

4

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


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