Использование нескольких JFrames: хорошая или плохая практика? [закрыто]
Проблема с использованием нескольких JFrame в приложении на Java
Я разрабатываю приложение, которое отображает изображения и воспроизводит звуки из базы данных. В процессе разработки мне нужно решить, стоит ли использовать отдельный JFrame для добавления изображений в базу данных из графического интерфейса (GUI).
Сейчас я задаюсь вопросом: является ли хорошей практикой использование нескольких окон JFrame в одном приложении?
Буду признателен за мнение сообщества: какие плюсы и минусы есть у такого подхода? Есть ли у кого-то опыт работы с несколькими окнами, и как это сказывается на пользовательском опыте и управлении приложением?
5 ответ(ов)
Чтобы сделать JInternalFrame
частью главного окна (JFrame
) и сделать его невидимым, можно использовать следующий подход. Сначала добавьте JInternalFrame
в основной фрейм, затем установите его видимость в false
, чтобы он не отображался, но при этом оставался доступным для обработки событий. Вот пример кода для выполнения этой задачи:
JInternalFrame jInternalFrame = new JInternalFrame("My Internal Frame");
jInternalFrame.setSize(300, 150);
// Добавляем InternalFrame в главный фрейм
mainFrame.add(jInternalFrame);
// Делаем InternalFrame невидимым
jInternalFrame.setVisible(false);
Таким образом, вы можете использовать jInternalFrame
для дальнейших событий и взаимодействий, несмотря на то, что он не отображается на экране.
Это уже некоторое время назад, как я работал со Swing, но в целом считать использование нескольких JFrame плохой практикой. Вот некоторые основные недостатки, которые приходят на ум:
- Это более затратно: вам потребуется выделить значительно больше ресурсов для отрисовки JFrame по сравнению с другими контейнерами, такими как Dialog или JInternalFrame.
- Непросто в использовании: Навигация по множеству связанных между собой JFrame может быть затруднена; это создаёт впечатление, что ваше приложение представляет собой набор несогласованных и плохо спроектированных приложений.
- Использовать JInternalFrame проще: Это скорее риторический вопрос, но сейчас это гораздо проще, и другие более умные люди (или обладающие большим количеством свободного времени) уже продумали использование шаблона Desktop и JInternalFrame, поэтому я бы рекомендовал использовать именно его.
Определенно, это плохая практика. Одна из причин заключается в том, что это не очень «удобно для пользователя»: каждый JFrame
создает новую иконку в панели задач. Управлять несколькими JFrame
будет крайне сложно и утомительно.
Лично я бы использовал ОДИН JFrame
для вашего типа приложения. Способы отображения множества компонентов зависят от вас, и их существует много: Canvas
, JInternalFrame
, CardLayout
, возможно, даже JPanel
.
Несколько объектов JFrame
= Боль, проблемы и неприятности.
Я думаю, что использование нескольких JFrame
не является хорошей идеей.
Вместо этого мы можем использовать несколько JPanel
в одном и том же JFrame
.
Также мы можем переключаться между этими JPanel
, что позволяет нам отображать больше одного элемента в JFrame
одновременно.
Для каждого JPanel
мы можем разработать различные элементы, и все эти JPanel
могут отображаться на одном JFrame
, но по одному в одно время.
Чтобы переключаться между этими JPanel
, можно использовать JMenuBar
с JMenuItems
для каждого JPanel
, либо JButton
для каждой JPanel
.
Более одного JFrame
не является хорошей практикой, но в принципе нет ничего плохого в том, чтобы использовать несколько JFrame
, если это необходимо.
Тем не менее, лучше адаптировать один JFrame
под разные потребности, чем иметь множество JFrame
.
Если размеры фреймов будут одинаковыми, почему бы не создать один фрейм и передавать его как ссылку?
Создав фрейм и передав его, вы сможете самостоятельно решать, как его заполнять. Это похоже на ситуацию с методом, который вычисляет среднее значение набора данных. Зачем создавать этот метод снова и снова?
Передавая ссылку на общий фрейм, вы сокращаете количество повторяющегося кода и облегчаете его сопровождение. Это также улучшает производительность, поскольку не требуется выделение памяти для каждого нового фрейма. Если требования к заполнению фрейма меняются, вы можете спокойно изменять логику, не затрагивая создание самого фрейма.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности