1

我正在尝试找出有关Swing 中JLayeredPane的一些信息。如果有人使用过这个类,我们将不胜感激。

getLayer(JComponent c) 的文档指出:

获取 JComponent 的 layer 属性,它不会像 setLayer() 那样产生任何副作用。(绘画、添加/删除等) 通常您应该使用实例方法 getLayer()。

显然,这里有一些错误,因为这是实例方法 getLayer() (没有重载版本)

实际上是否应该在这里进行不同的调用,或者是有人太急于从 putLayer() 复制:

设置 JComponent 的 layer 属性。此方法不会导致任何副作用,例如 setLayer()(绘画、添加/删除等)。通常,您应该使用实例方法 setLayer(),以获得所需的副作用(如重新绘制)。

4

1 回答 1

2

像 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 实例的属性,但组件实例的层存储在 JLayeredPane 的哈希表中。因此,getLayer(JComponent c) 可以是静态的,而 getLayer(Component c) 不能。

正如你可能想象的那样,这只是这个类的陌生的开始。验证和绘制 JLayeredPane 和内容会很快变得复杂。

于 2009-02-10T16:22:06.093 回答