java - SwingUtilities.windowForComponent(JFrame) devuelve nulo
(1)
Puede confundir la jerarquía de clases con la jerarquía de contención . La declaración JFrame extends Window
representa una relación de subclase / superclase, mientras que getWindowAncestor()
examina la relación de dos instancias de Container
. Tenga en cuenta que JFrame
es un top-level container
y una subclase de Window
.
frame
es el único JFrame
en mi aplicación Swing. Como JFrame
extiende Window
, he creído por descripción y nombre de método que el código debería devolver el marco en sí.
SwingUtilities.windowForComponent(frame)
público estático Ventana windowForComponent (Component aComponent)
Devuelve la ventana de aComponent
Pero devuelve null
, porque la implementación es así
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;
}
¿Estás de acuerdo en que la implementación del método no es precisa?
UPD: me refiero a que JFrame se pasa al método windowForComponent
, JFrame
extends Window
por lo que debería haber una verificación adicional como
if (c instanceof Window) return (Window)c; //in windowForComponent
UPD2: Entonces tendría que implementar
public static Window windowForComponent (Component c) {
if (c instanceof Window)
return (Window)c;
return SwingUtilities.windowForComponent(c);
}