Я разрабатываю приложение, которое отображает изображения и воспроизводит звуки из базы данных. Я пытаюсь решить, следует ли использовать отдельный JFrame для добавления изображений в базу данных из графического интерфейса.
Мне просто интересно, является ли хорошей практикой использование нескольких окон JFrame?
java
swing
user-interface
jframe
разносчик
источник
источник
Ответы:
Плохая (плохая, плохая) практика.
Существует множество способов отображения множества элементов в одном графическом интерфейсе, например:
CardLayout
(короткая демонстрация. ) Хорош для:JInternalFrame
/JDesktopPane
обычно используется для MDI .JTabbedPane
для групп компонентов.JSplitPane
Способ отображения двух компонентов, важность которых для одного или другого (размер) зависит от того, что делает пользователь.JLayeredPane
далеко много хорошо .. слоистых компонентов.JToolBar
обычно содержит группы действий или элементов управления. Может перетаскиваться по всему графическому интерфейсу или полностью отключаться в соответствии с потребностями пользователя. Как упоминалось выше, будет минимизировано / восстановлено в соответствии с действиями родителя.JList
(простой пример ниже).JTree
.Но если эти стратегии не работают для конкретного варианта использования, попробуйте следующее. Создайте один главный
JFrame
, затем появитеJDialog
илиJOptionPane
создайте экземпляры для остальных свободно плавающих элементов, используя рамку в качестве родительского для диалогов.Много изображений
В этом случае, когда несколько элементов являются изображениями, было бы лучше использовать одно из следующих:
JLabel
(по центру на панели прокрутки) для отображения любого изображения, интересующего пользователя в данный момент. Как видно вImageViewer
.JList
. Как видно из этого ответа . «Однорядная» часть этого работает, только если они имеют одинаковые размеры. Альтернативно, если вы готовы масштабировать изображения на лету, и все они имеют одинаковое соотношение сторон (например, 4: 3 или 16: 9).источник
JFrame
секунд, и никогда не рассматривал эти проблемы, спасибо за разъяснения!Многофункциональный
JFrame
подход был тем, что я реализовал с тех пор, как начал программировать приложения Swing. По большей части, я сделал это в начале, потому что я не знал ничего лучше. Тем не менее , по мере того, как я становился зрелым в своем опыте и знаниях в качестве разработчика и начал читать и воспринимать мнения многих более опытных разработчиков Java в Интернете, я попытался отойти от многократногоJFrame
подхода (как в текущих проектах, так и в будущих проектах). ) только встретиться с ... получить это ... сопротивление от моих клиентов! Когда я начал внедрять модальные диалоги для управления «дочерними» окнами и окнамиJInternalFrame
для отдельных компонентов, мои клиенты начали жаловаться!Я был очень удивлен, поскольку делал то, что считал лучшей практикой! Но, как говорится, «счастливая жена - это счастливая жизнь». То же самое касается ваших клиентов. Конечно, я являюсь подрядчиком, поэтому мои конечные пользователи имеют прямой доступ ко мне, разработчику, что, очевидно, не является обычным сценарием.Итак, я собираюсь объяснить преимущества множественного
JFrame
подхода, а также рассказать о некоторых минусах, представленных другими.JFrame
элементам, вы даете конечному пользователю возможность распределять и контролировать то, что находится на его экране. Концепция чувствует себя «открытой» и не стесняющей. Вы теряете это, когда идете к одному большомуJFrame
и кучкеJInternalFrame
с.JFrame
с. Однако я хотел, чтобы экран ввода данных был тем,JDialog
чьим родителем был просмотрщик данных. Я внес изменение, и сразу же мне позвонил конечный пользователь, который сильно полагался на то, что он может свернуть или закрыть средство просмотра и оставить редактор открытым, пока он ссылается на другую часть программы (или веб-сайт, который я не помню). Он не на мульти-мониторе, поэтому ему нужно, чтобы диалог ввода был первым и что-то ещебыть вторым, с просмотром данных полностью скрытым. Это было невозможно с aJDialog
и, конечно, было бы невозможно и с aJInternalFrame
. Я неохотно изменил это, чтобы быть отдельнымJFrames
для его здравомыслия, но это преподало мне важный урок.JInternalFrame
чемJFrame
. На самом деле, по моему опыту,JInternalFrames
предлагаем гораздо меньше гибкости. Я разработал систематический способ обработки открывания и закрыванияJFrame
s в моих приложениях, который действительно хорошо работает. Я почти полностью контролирую фрейм из самого кода фрейма; создание нового фрейма,SwingWorker
который управляет извлечением данных в фоновых потоках и кода графического интерфейса пользователя в EDT, восстановление / вывод на передний план фрейма, если пользователь пытается открыть его дважды, и т. д. Все, что вам нужно, это открыть мойJFrame
файл. вызовите открытый статический методopen()
и метод open в сочетании сwindowClosing()
событие обрабатывает все остальное (фрейм уже открыт? он не открыт, но загружается? и т. д.). Я сделал этот подход шаблоном, чтобы его не сложно было реализовать для каждого фрейма.JFrame
требуется больше места, чемJInternalFrame
, даже если вы откроете 100JFrame
с, сколько ресурсов вы бы действительно потребляли? Если вас беспокоит утечка памяти из-за ресурсов: вызовdispose()
освобождает все ресурсы, используемые фреймом для сборки мусора (и, опять же, я говорю, aJInternalFrame
должен вызывать точно такую же проблему).Я много писал и чувствую, что могу писать больше. В любом случае, я надеюсь, что за меня не проголосуют просто потому, что это непопулярное мнение. Вопрос явно ценный, и я надеюсь, что дал ценный ответ, даже если это не общее мнение.
Отличным примером нескольких кадров / одного документа на кадр ( SDI ) по сравнению с одним кадром / несколькими документами на кадр ( MDI ) является Microsoft Excel. Некоторые из преимуществ MDI:
SDI (интерфейс с одним документом, т. Е. Каждое окно может иметь только один документ):
MDI (многодокументный интерфейс, т. Е. Каждое окно может иметь несколько документов):
источник
JFrame
и большой родительJTabbedPane
; но с возможностью открыть второе окно (или даже больше), где макет может отличаться, предлагая, следовательно, гибридное поведение, когда любители SDI довольны и MDI тоже. Во всех случаях я всегда считалJInternalFrame
ужасным паттерном, который доставляет вам все неудобства обоих миров. Гибкость, которую они предлагают, просто отстой, и они поглощают много драгоценного экранного пространства ни для каких реальных целей.JFrame
имеет свой значок на панели задач. Иногда это именно то, что вы хотите, но иногда это не так. В WinAPI это легко настроить, но в Swing кажется, что это невозможно.JDialog
чемJFrame
.Я бы хотел противопоставить аргумент "не дружественный пользователю" примером, с которым я только что работал.
В нашем приложении у нас есть главное окно, в котором пользователи запускают различные «программы» в виде отдельных вкладок. В максимально возможной степени мы старались держать наше приложение в этом единственном окне.
Одна из «программ», которые они запускают, представляет список отчетов, которые были сгенерированы системой, и пользователь может щелкнуть значок в каждой строке, чтобы открыть диалоговое окно просмотра отчетов. Этот вьюер показывает эквивалент страниц (4) в книжной / альбомной ориентации отчета, поэтому пользователям нравится, что это окно довольно большое, почти полностью заполняющее их экраны.
Несколько месяцев назад мы начали получать запросы от наших клиентов, чтобы сделать эти окна просмотра отчетов немодальными, чтобы они могли одновременно открывать несколько отчетов.
Некоторое время я отказывался от этого запроса, так как не думал, что это хорошее решение. Однако мое мнение изменилось, когда я узнал, как пользователи обходят этот «недостаток» нашей системы.
Они открывали программу просмотра, используя функцию «Сохранить как», чтобы сохранить отчет в виде PDF-файла в определенный каталог, используя Acrobat Reader, чтобы открыть файл PDF, и затем они делали то же самое со следующим отчетом. У них будет несколько читателей Acrobat, работающих с различными выводами отчетов, которые они хотят просмотреть.
Поэтому я смягчился и сделал зрителя немодальным. Это означает, что у каждого зрителя есть значок на панели задач.
Когда последняя версия была выпущена для них на прошлой неделе, подавляющим ответом было то, что они ЛЮБЯТ это. Это было одним из наших самых популярных последних улучшений в системе.
Итак, вы идете вперед и говорите своим пользователям, что то, что они хотят, плохо, но в конечном итоге это не принесет вам пользы.
НЕКОТОРЫЕ ЗАМЕЧАНИЯ:
ModalityType
а не логическийmodal
аргумент. Это то, что дает этим диалогам значок панели задач.источник
Сделайте jInternalFrame в основной кадр и сделайте его невидимым. Затем вы можете использовать его для дальнейших событий.
источник
Прошло много времени с тех пор, как я в последний раз касался свинга, но в целом это плохая практика. Некоторые из основных недостатков, которые приходят на ум:
Это дороже: вам придется выделять больше ресурсов для рисования JFrame, чем другие виды оконных контейнеров, такие как Dialog или JInternalFrame.
Не удобно для пользователя. Нелегко ориентироваться в куче JFrame, склеенных вместе, это будет выглядеть так, как будто ваше приложение является набором непоследовательных и плохо спроектированных приложений.
Использовать JInternalFrame просто. Это своего рода реторика, теперь это намного проще, и другие люди умнее (или с большим количеством свободного времени), чем мы уже продумали шаблон Desktop и JInternalFrame, поэтому я рекомендую использовать его.
источник
JInternalFrame
? Лично я не согласен с использованиемJInternalFrame
s!CardLayout
это настоящее благословение!JInternalFrame
не дает никаких преимуществ ни в одном из трех упомянутых вами случаев (1. где доказательства, которыеJInternalFrame
легче, чемJFrame
? 2. вашиJInternalFrame
s могут быть столь же загроможденными / грязными / склеенными, как кучаJFrame
s. 3. какJInternalFrame
проще? тот же самый точный код, за исключением того, что один содержится в aJDesktopPane
и один содержится в естественной области экрана. Они звучат для меня одинаково сложно.)JComponent
s, оба имеют почти идентичные структуры, за исключением того, что один отображается на a,JDesktop
а другой - нет. Опять извините, но я верю, что вы спекулируете относительно "веса"JFrame
. 2. Мои приложения используют SDI, и мои клиенты очень довольны. Тем не менее, вы сказали «тонна окон», что, конечно, было бы плохо. Но моя точка зрения такова: "тонна"JInternalFrame
будет сосать так же плохо! Если вы говорите, что JIF-файлы позволяют вам быть небрежным дизайнером пользовательского интерфейса, то это ужасно. Беспорядок в беспорядке - беспорядок в беспорядке, будь то JF или JIF.Плохая практика определенно. Одна из причин заключается в том, что он не очень удобен для пользователя, поскольку каждый из них
JFrame
отображает новый значок на панели задач. Управление несколькимиJFrame
секциями заставит вас рвать на себе волосы.Лично я бы использовал ОДИН
JFrame
для вашего вида приложений. Методы отображения нескольких вещей зависит от вас, их много.Canvas
эс,JInternalFrame
,CardLayout
дажеJPanel
S возможно.Несколько объектов JFrame = Боль, неприятности и проблемы.
источник
Я думаю, использование нескольких
Jframe
s не очень хорошая идея.Вместо этого мы можем использовать
JPanel
более одного или болееJPanel
одинаковыхJFrame
.Также мы можем переключаться между этим
JPanel
с. Так что это дает нам свободу отображать больше, чем вещиJFrame
.Для каждого
JPanel
мы можем создавать разные вещи, и все этоJPanel
может отображаться поJFrame
одному за раз.Для переключения между этим
JPanel
ами использованияJMenuBar
сJMenuItems
для каждогоJPanel
или «JButtonfor each
JPanel`.Больше, чем один
JFrame
, не очень хорошая практика, но нет ничего плохого, если мы хотим больше, чем одинJFrame
.Но лучше изменить один
JFrame
для наших различных потребностей, а не с несколькимиJFrame
s.источник
Если фреймы будут одинакового размера, почему бы не создать фрейм и не передать фрейм в качестве ссылки на него.
Когда вы прошли кадр, вы можете решить, как его заполнить. Это было бы похоже на метод расчета среднего числа фигур. Будете ли вы создавать метод снова и снова?
источник
Это не очень хорошая практика, но даже если вы хотите использовать ее, вы можете использовать шаблон синглтона в качестве ее хорошего. Я использовал одноэлементные шаблоны в большинстве моих проектов, это хорошо.
источник