Найти владельца выпадающего списка
У меня есть всплывающее окно с настройками, отображаемыми для пользователя. Если вы щелкнете снаружи, он будет скрыт, но если вы нажмете внутри, он останется видимым
Обработчик события, обрабатывающий это поведение, получает Component
(который был нажат) и с помощью component.getParent()
рекурсивно я могу проверить, является ли это дочерним элементом моей панели настроек. Это сработало до сих пор.
Но я только что добавил JComboBox
на эту панель, и получается, что всплывающее окно "Выбираемые элементы" (имеет ли оно имя?), которое отображается при нажатии, не является дочерним элементом этого поля. Попытка выбрать что-либо в поле со списком скрыла бы мою панель настроек.
Используя отладчик NetBeans, я вижу его типа BasicComboPopup$1
(это анонимный класс?), но это не экземпляр ни того, ни другого ComboPopup
, JPopupMenu
ни BasicComboPopup
,
Мне нужен способ идентифицировать комбинированный список владельца / родителя всплывающего окна со списком.
2 ответа
Не совсем уверен, но вы, возможно, ищете
popup.getInvoker();
который вернул бы вызывающий comboBox.
Приведенный ниже служебный метод (скопированный из SwingXUtilities, который поставляется с платформой SwingX): учитывая, что вы нашли исходный компонент (неудачное именование в методе - focusOwner;-) события, он проверяет, находится ли этот источник где-то ниже родительского, включая всплывающие окна,
Просто заметил, что ваш родитель - всплывающее окно, поэтому вам нужно немного изменить логику, переключая первый и второй блок if (не пытался, хотя - необычно иметь более одного видимого всплывающего окна.:-)
/**
* Returns whether the component is part of the parent's
* container hierarchy. If a parent in the chain is of type
* JPopupMenu, the parent chain of its invoker is walked.
*
* @param focusOwner
* @param parent
* @return true if the component is contained under the parent's
* hierarchy, coping with JPopupMenus.
*/
public static boolean isDescendingFrom(Component focusOwner, Component parent) {
while (focusOwner != null) {
if (focusOwner instanceof JPopupMenu) {
focusOwner = ((JPopupMenu) focusOwner).getInvoker();
if (focusOwner == null) {
return false;
}
}
if (focusOwner == parent) {
return true;
}
focusOwner = focusOwner.getParent();
}
return false;
}
not sure if you talking about
mouse
событиеkeyboard
событиеmouse
а такжеkeyboard
событие
have look at SwingUtilities there are methods for
child
противparent
и наоборотpost an SSCCE, with detailed descriptions about desired events, becaue there a few ways how to extraxt and modify the
Popup
отJComboBox
РЕДАКТИРОВАТЬ
in the case that you use AWT Popup
or mixing Swing lightweight
с AWT heavyweight
components, then you have to look at Swing Utils by Darryl