Найти владельца выпадающего списка

У меня есть всплывающее окно с настройками, отображаемыми для пользователя. Если вы щелкнете снаружи, он будет скрыт, но если вы нажмете внутри, он останется видимым

Обработчик события, обрабатывающий это поведение, получает 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;
}
  1. not sure if you talking about

    • mouse событие

    • keyboard событие

    • mouse а также keyboard событие

  2. have look at SwingUtilities there are methods for child против parent и наоборот

  3. 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

Другие вопросы по тегам