Как ссылаться на контейнер верхнего уровня во всем приложении, не делая его одноэлементным? - PullRequest
3 голосов
/ 08 февраля 2012

Как я могу ссылаться на контейнер верхнего уровня (например, JFrame) во всем приложении, не делая его одиночным?Причина, по которой я спрашиваю, состоит в том, что я пытаюсь избежать одноэлементного антипаттерна.

В любом случае, я нахожу, что когда мне нужен другой контейнер верхнего уровня (например, JDialog) для отображения простого сообщения пользователю, я хочу, чтобы это диалоговое окно было расположено непосредственно над вышеупомянутым JFrame, используяsetLocationRelativeTo(frame).Но единственный способ, которым я могу сделать это (на данный момент), - это сделать один экземпляр JFrame и получить к нему доступ, используя статический метод getInstance.

Итак, есть ли способ ссылкиконтейнер верхнего уровня без необходимости прибегать к одноэлементному шаблону?Пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация!

Спасибо.

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Если у вас есть ссылка на любой компонент Swing, содержащийся в окне верхнего уровня, например, который можно получить из метода объекта Event (такого как ActionEvent) getSource(), вы можете использовать его для получения окна верхнего уровня черезa SwingUtilities метод:

SwingUtilities.getWindowAncestor(anyComponent);

Этот класс также имеет другие полезные и похожие методы, такие как windowForComponent(Component c) getDeepestComponentAt(...) и getRoot(Component c)

В противном случае вы всегда можетепередавать ссылки через параметры конструктора или установщика.

2 голосов
/ 08 февраля 2012

1) Текущий экземпляр JVM может возвращать массив Top-level Containers, включая удаленный

Window[] allWindows = Window.getWindows();

по умолчанию все Top-level Containers доступны и готовы к повторному использованию

2) JFrame может вернуть всех потомков, включая выбывших, уведомление, если есть 2-й или более JFrames, тогда требуется использование getWindows()

Window[] allWindows = Window.getOwnedWindows();
0 голосов
/ 08 февраля 2012

Вы можете создавать свои диалоги (JDialog) с указанным родителем, таким образом вы можете сохранить ссылку на родительский объект, взглянуть на конструктор JDialog:

public JDialog(Frame owner)

http://docs.oracle.com/javase/6/docs/api/javax/swing/JDialog.html#JDialog%28java.awt.Frame%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...