Использование нескольких JFrames: хорошая или плохая практика? [закрытый]
Я разрабатываю приложение, которое отображает изображения и звуки из базы данных. Я пытаюсь решить, следует ли использовать отдельный JFrame для добавления изображений в базу данных из графического интерфейса.
Мне просто интересно, является ли хорошей практикой использовать несколько окон JFrame?
9 ответов:
мне просто интересно, является ли хорошей практикой использовать несколько JFrames?
плохой (плохая, плохая) практика.
- пользователь недружелюбно: пользователь видит несколько значков в своей панели задач, ожидая увидеть только один. Плюс побочные эффекты проблем с кодированием..
- кошмар кодировать и поддерживать:
- A модальные предлагает легкую возможность сосредоточить внимание на содержании, что диалоговое окно-выберите / исправить / отменить это,затем продолжить. Несколько кадров не делают.
- диалог (или плавающая панель инструментов) с родителем выйдет на передний план, когда родитель будет нажат - вам придется реализовать это в кадрах, если это было желаемое поведение.
есть любое количество способов отображения множества элементов в одном графическом интерфейсе, например:
CardLayout
(короткий демо.). Хорош для:
- показывает, как мастер диалогов.
- список отображения, дерево и т. д. выбор элементов, имеющих связанный компонент.
- переключение между без компонента и видимого компонента.
JInternalFrame
/JDesktopPane
обычно используется для MDI.JTabbedPane
для групп компонентов.JSplitPane
A способ отображения двух компонентов, важность которых между одним или другим (размер) зависит от того, что делает пользователь.JLayeredPane
далеко не многие ..слоистые компоненты.JToolBar
обычно содержит группы действий или контроля. Можно перетащить вокруг графического интерфейса, или от него полностью в соответствии с потребностями пользователя. Как упоминалось выше, будет минимизировать / восстановить в соответствии с родительским делать это.- как элементы в a
JList
(простой пример ниже).- как узлы в
JTree
.- вложенные макеты.
но если эти стратегии не работают для конкретного случая использования, попробуйте следующее. Установите единую главную
JFrame
, то естьJDialog
илиJOptionPane
экземпляры отображаются для остальных свободно плавающих элементов, используя фрейм в качестве родителя для диалоги.много картинок
в этом случае, когда несколько элементов являются изображениями, было бы лучше использовать вместо этого одно из следующих:
- один
JLabel
(по центру в области прокрутки) для отображения любого изображения, которое интересует пользователя в данный момент. Как видно вImageViewer
.
- одна строка
JList
. Как видно в ответ. "Одна строка" часть этого только работает, если все они имеют одинаковые размеры. Поочередно, если вы готовы масштабировать изображения на лету, и все они имеют одинаковое соотношение сторон (например, 4:3 или 16:9).
несколько
JFrame
подход был чем-то, что я реализовал с тех пор, как начал программировать приложения Swing. По большей части, я сделал это в начале, потому что я не знал ничего лучшего. , как я созрел в своем опыте и знаниях в качестве разработчика и как начал читать и впитывать мнения многих более опытных Java-разработчиков в Интернете, я сделал попытку сдвиг с множественнымиJFrame
подход (как в текущих проектах, так и в будущем проекты) только для удовлетворения... получить это... сопротивление от моих клиентов! как я начал реализовывать модальные диалоги для управления "дочерними" окнами иJInternalFrame
S для отдельных компонентов, мои клиенты начали жаловаться! я был очень удивлен, так как я делал то, что я думал, было лучшей практикой! Но, как говорится, "счастливая жена-это счастливая жизнь.- То же самое касается и ваших клиентов. Конечно, я подрядчик, поэтому мои конечные пользователи имеют прямой доступ ко мне, разработчику, что очевидно не самый распространенный сценарий.Итак, я собираюсь объяснить преимущества нескольких
JFrame
подход, а также миф-бюст некоторые из минусов, которые другие представили.
- максимальная гибкость в компоновке - позволяя отделить
JFrame
s, вы даете своему конечному пользователю возможность распространять и контролировать то, что находится на его/ее экране. Концепция чувствует себя "открытой" и не сжимающей. Вы теряете это, когда вы идете к одному большомуJFrame
и кучаJInternalFrame
s.- хорошо работает для очень модульных приложений - в моем случае, большинство моих приложений имеют 3-5 больших "модулей", которые на самом деле не имеют ничего общего друг с другом вообще. Например, один модуль может быть панелью продаж, а другой-панелью учета. Они не разговаривают друг с другом или что-нибудь. Тем не менее, руководитель может захотеть открыть оба, и они являются отдельными кадрами на панели задач, что делает его жизнь облегчающий.
- делает его легким для пользователей сослаться на внешний материал - однажды у меня была такая ситуация: у моего приложения был "просмотрщик данных", из которого вы могли нажать "Добавить новый", и он откроет экран ввода данных. Первоначально, оба были
JFrame
s. однако я хотел, чтобы экран ввода данных былJDialog
чей родитель был средством просмотра данных. Я внес изменения, и сразу же получил звонок от конечного пользователя, который сильно полагался на то, что он может свести к минимуму или закрыть просмотр и сохранить редактор открыть, пока он ссылается на другую часть программы (или веб-сайт, я не помню). Он не на мульти-мониторе, поэтому ему нужно, чтобы диалог ввода был первым и что-то другое быть во-вторых, с просмотра данных полностью скрыты. Это было невозможно сJDialog
и, конечно, было бы невозможно сJInternalFrame
Как хорошо. Я неохотно изменил его обратно, чтобы быть отдельнымJFrames
для его здравомыслие, но оно преподало мне важный урок.- миф: трудно код - это не соответствует моему опыту. Я не понимаю, почему было бы легче создать
JInternalFrame
чем aJFrame
. На самом деле, по моему опыту,JInternalFrames
предложение гораздо меньше гибкости. Я разработал систематический способ обработки открытия и закрытияJFrame
s в моих приложениях, которые действительно хорошо работают. Я контролирую кадр почти полностью из самого кода кадра; создание нового кадр,SwingWorker
s, которые управляют извлечением данных о фоновых потоках и коде GUI на EDT, восстанавливая/выводя на передний план кадр, если пользователь пытается открыть его дважды и т. д. Все, что вам нужно, чтобы открыть мойJFrame
s-это вызов публичного статического методаopen()
и открытый метод, в сочетании сwindowClosing()
событие обрабатывает остальные (кадр уже открыт? он не открыт, но загружается? так далее.) Я сделал этот подход шаблоном, поэтому его не сложно реализовать для каждого рамка.- Миф / Недоказанный: Ресурс Тяжелый - я хотел бы увидеть некоторые факты за этим спекулятивным заявлением. Хотя, пожалуй, можно было бы сказать и
JFrame
нужно больше места, чемJInternalFrame
, даже если вы откроете 100JFrame
s, сколько еще ресурсов вы действительно потребляете? Если вас беспокоит утечка памяти из-за ресурсов: вызовdispose()
освобождает все ресурсы, используемые фреймом для сбора мусора (и, опять же, я говорю, aJInternalFrame
должен вызывать именно та же забота).я написал много, и я чувствую, что мог бы написать больше. В любом случае, я надеюсь, что я не буду голосовать просто потому, что это непопулярное мнение. Вопрос явно ценный, и я надеюсь, что дал ценный ответ, даже если это не общее мнение.
отличный пример нескольких кадров / одного документа на кадр ( SDI) против одного кадра / нескольких документов на кадр (MDI) - это Microsoft Excel. Некоторые преимущества MDI:
- можно иметь несколько окон в не прямоугольной форме-поэтому они не скрывают рабочий стол или другое окно от другого процесса (например, веб-браузер)
- можно открыть окно из другого процесса над одним окном Excel во время записи во втором окне Excel - с MDI, пытаясь написать в одном из внутренних окон даст фокус на все окно Excel, следовательно, скрывая окно от другого процесса
- можно разные документы на разных экранах, что особенно полезно, когда экраны не имеют одинаковое разрешение
SDI (интерфейс с одним документом, т. е. каждое окно может иметь только один документ):
MDI (интерфейс с несколькими документами, т. е. каждое окно может иметь несколько документов):
Я хотел бы противостоять аргументу "не дружественный к пользователю" с примером, с которым я только что был связан.
в нашем приложении у нас есть главное окно, где пользователи запускают различные "программы" в виде отдельных вкладок. Насколько это возможно, мы постарались сохранить наше приложение в этом одном окне.
одна из "программ", которые они запускают, представляет собой список отчетов, которые были сгенерированы системой, и пользователь может нажать на значок в каждой строке, чтобы открыть отчет диалог просмотра. Этот просмотрщик показывает эквивалент портретной / альбомной страницы A4 отчета, поэтому пользователям нравится, чтобы это окно было довольно большим, почти заполняя их экраны.
несколько месяцев назад мы начали получать запросы от наших клиентов, чтобы сделать эти окна просмотра отчетов немодальными, чтобы они могли одновременно открывать несколько отчетов.
в течение некоторого времени я сопротивлялся этой просьбе, поскольку я не думал, что это было хорошим решением. Тем не менее, мой ум был изменилось, когда я узнал, как пользователи обходили этот "недостаток" нашей системы.
они открывали средство просмотра, используя функцию "Сохранить как", чтобы сохранить отчет в формате PDF в определенный каталог, используя Acrobat Reader, чтобы открыть файл PDF, а затем они сделают то же самое со следующим отчетом. У них будет несколько читателей Acrobat, работающих с различными выходными данными отчета, которые они хотели бы посмотреть.
, когда последняя версия была выпущена на прошлой неделе, отклик от них, что они любят его. Это было одним из наших самых популярных последних усовершенствований системы.
Итак, вы идете вперед и говорите своим пользователям, что то, что они хотят, плохо, но в конечном итоге это не принесет вам никакой пользы.
НЕКОТОРЫЕ ПРИМЕЧАНИЯ:
- кажется, лучше всего использовать JDialog для этих немодальных windows
- используйте конструкторы, которые используют новый
ModalityType
а не булево
сделать jInternalFrame в основной кадр и сделать его невидимым. Затем вы можете использовать его для дальнейших событий.
jInternalFrame.setSize(300,150); jInternalFrame.setVisible(true);
Это было время, так как в последний раз я касаюсь на качелях, но в целом это плохая практика, чтобы сделать это. Некоторые из основных недостатков, которые приходят на ум:
Это дороже: вам придется выделить больше ресурсов, чтобы нарисовать JFrame, что другой вид контейнера окна, такие как Dialog или JInternalFrame.
не работает: нелегко перемещаться в кучу JFrame, склеенных вместе, это будет выглядеть ваше приложение как набор непоследовательных приложений и плохо спроектированных.
Это простой в использовании JInternalFrame это своего рода реторика, теперь это намного проще, и другие люди умнее ( или с большим количеством свободного времени), чем мы уже продумали шаблон рабочего стола и JInternalFrame, поэтому я бы рекомендовал его использовать.
плохая практика наверняка. Одна из причин заключается в том, что это не очень "удобный" для того, что каждый
JFrame
показывает новый значок на панели задач. Управление несколькимиJFrame
s заставит вас рвать волосы.лично я бы использовал один
JFrame
для вашего типа приложения. Методы отображения нескольких вещей зависит от вас, есть много.Canvas
ЭсJInternalFrame
,CardLayout
, дажеJPanel
С, возможно.несколько объектов JFrame = боль, проблемы и проблемы.
я думаю, что через несколько
Jframe
s не очень хорошая идея.вместо этого мы можем использовать
JPanel
s более одного или болееJPanel
в том жеJFrame
.также мы можем переключаться между этим
JPanel
s. таким образом, это дает нам свободу отображать больше, чем на вещи вJFrame
.для каждого
JPanel
мы можем проектировать разные вещи, и все этоJPanel
может отображаться на одномJFrame
одному за раз.для переключения между этим
JPanel
использование sJMenuBar
СJMenuItems
для каждогоJPanel
или ' JButtonfor each
JPanel'.более одного
JFrame
- это не очень хорошая практика, но нет ничего плохого, если мы хотим больше, чем одинJFrame
.но его лучше менять один
JFrame
для наших различных потребностей, а не несколькоJFrame
s.