Как и многие вещи в Swing, ответ на ваш вопрос раскрывается в исходном коде Swing. От JLayeredPane.java:
public static int getLayer(JComponent c) {
Integer i;
if((i = (Integer)c.getClientProperty(LAYER_PROPERTY)) != null)
return i.intValue();
return DEFAULT_LAYER.intValue();
}
public int getLayer(Component c) {
Integer i;
if(c instanceof JComponent)
i = (Integer)((JComponent)c).getClientProperty(LAYER_PROPERTY);
else
i = (Integer)getComponentToLayer().get((Component)c);
if(i == null)
return DEFAULT_LAYER.intValue();
return i.intValue();
}
Похоже, причина того, что вы видите здесь некоторые различия, заключается в том, что слой экземпляра JComponent хранится как свойство экземпляра JComponent, но слой экземпляра Component хранится в хеш-таблице JLayeredPane. Следовательно, getLayer (JComponent c) может быть статическим, а getLayer (Component c) - нет.
Как вы можете себе представить, это только начало странности этого класса. Проверка и рисование JLayeredPane и его содержимого могут быстро усложниться.