SwingUtilities.windowForComponent(JFrame) возвращает значение null

frame — единственный JFrame в моем приложении Swing. Поскольку JFrame расширяет Window, по описанию и названию метода я полагал, что код должен возвращать сам фрейм.

SwingUtilities.windowForComponent(frame)

общедоступное статическое окно windowForComponent (компонент aComponent)

Вернуть окно компонента

Но возвращает null, потому что реализация такая

 public static Window windowForComponent(Component c) {
    return getWindowAncestor(c);
 } 

 public static Window getWindowAncestor(Component c) {
    for(Container p = c.getParent(); p != null; p = p.getParent()) {
        if (p instanceof Window) {
            return (Window)p;
        }
    }
    return null;
 }

Вы согласны с тем, что реализация метода неточна?

UPD: я имею в виду, что JFrame передается в метод windowForComponent, JFrame расширяет Window, поэтому должна быть дополнительная проверка, например

if (c instanceof Window) return (Window)c; //in windowForComponent

UPD2: Поэтому мне пришлось бы реализовать

public static Window windowForComponent (Component c) {
    if (c instanceof Window) 
        return (Window)c;

    return SwingUtilities.windowForComponent(c);
}

person Nikolay Kuznetsov    schedule 15.01.2013    source источник
comment
Я не вижу ничего плохого ни в описании, ни в реализации. Что вы ожидаете получить от метода? Родная реализация окна? В любом случае, это не похоже на настоящий вопрос, скорее на то, что вы хотели бы обсудить на форуме...   -  person asermax    schedule 15.01.2013
comment
Возможно, вы путаете иерархию class с иерархией containment.   -  person trashgod    schedule 15.01.2013
comment
@asermax, я добавил UPD и код для windowForComponent()   -  person Nikolay Kuznetsov    schedule 15.01.2013
comment
@trashgod, может быть, можно подробнее?   -  person Nikolay Kuznetsov    schedule 15.01.2013


Ответы (1)


Возможно, вы путаете иерархию класса с иерархией вмещения. Объявление JFrame extends Window представляет отношение подкласса/суперкласса, а getWindowAncestor() исследует отношение двух экземпляров Container. Обратите внимание, что JFrame является top-level container и подклассом Window.

person trashgod    schedule 15.01.2013
comment
о, кажется, я понимаю это. Но я не знаю, почему windowForComponent не реализовано как мое предложение в UPD2. Хотя @mKorbel утверждает, что это может зависеть от JDK. - person Nikolay Kuznetsov; 15.01.2013
comment
null означает, что c не содержится внутри Window; например, javax.swing.Popup очень зависит от платформы. Это может помочь узнать, какую проблему вы пытаетесь решить с помощью этого упражнения. - person trashgod; 15.01.2013