为什么我的 JLayeredPane 不遵守此方法中的 Z 索引?

Why isn't my JLayeredPane respecting the Z index in this method?

以下是 "Deck" 对象中的一个方法,它为我可能编写的各种纸牌游戏实例化和操作 Card 对象数组。这个特定的方法接受一个 JFrame 和一个 x 和 y 坐标作为参数,然后在该 JFrame 的那个位置创建一个 JLayeredPane 以显示卡片组中的卡片。一切正常,除了当它显示卡片时,JLayeredPane 不遵守 zOrd 定义的 Z 索引,并且卡片以我希望的相反顺序出现。

我在同一个 Jframe 上有一个 JLayeredPane,我将它传递给我在设计时放置在那里的这个方法,我使用非常相似的代码遍历甲板并在那里显示它们,它工作正常。所以我认为我的 JLayeredPane 有一些我没有在运行时做或设置的东西,它需要为了遵守 z 索引,但我不知道是什么。

非常感谢任何帮助。

    public void display(JFrame DisplayFrame, Integer x, Integer y) {
    int xPos = 0;
    int zOrd = 0;
    JPanel contentPane = (JPanel)DisplayFrame.getContentPane();
    JLayeredPane lp = new JLayeredPane();
    lp.setLayout(new FlowLayout());       
    Integer height = _cards[0].getCardImage().getHeight();
    Integer width = _cards.length * 15 + _cards[0].getCardImage().getWidth() - 15;
    lp.setBounds(x, y, width, height);
    contentPane.add(lp);

    for (Card _card : _cards) {
        JLabel cardLabel = new JLabel();
        cardLabel.setIcon(new ImageIcon(_card.getCardImage()));
        cardLabel.setBounds(xPos, 0, _card.getCardImage().getWidth(), _card.getCardImage().getHeight());
        lp.add(cardLabel, zOrd);
        xPos+=15;
        zOrd++;
    }
}

阅读有关 How to Use Layered Pane 的 Swing 教程部分以获得工作示例。编号较低的层在编号较高的层之前绘制。

相反,如果使用分层窗格,使用支持组件重叠的布局管理器可能是更好的解决方案。查看 Overlap Layout 以获得支持此功能的布局管理器。

Each card is appearing beneath previous card

lp.setLayout(new FlowLayout()); 

您没有正确使用分层窗格。当您使用 FlowLayout 时,组件的绘制顺序与组件添加到面板的顺序相反。也许你可以去掉 set layout 语句。

无论如何我已经给了你两个解决方案。

张贴答案以防有人在搜索中偶然发现这个问题。

在故障排除过程中,我想将 zOrd 添加到每个标签的文本中以跟踪每张卡片的 z 索引。为此,我将 zOrd 的变量类型从 int 更改为 Integer,这样我就可以在其上调用 .toString() 方法。当我这样做时,它起作用了。起初我认为向标签添加文本是造成差异的原因,但事实并非如此。我删除了 .setText() 方法并完全按照编写的方式使用了我的代码,除了 zOrd 被声明为整数而不是 int,并且它可以工作。为了加深神秘感,JLayeredPane.add() 方法的 javaDoc 甚至说参数应该是 (component cmpnt, int i).

编辑:我是 JAVA 的新手,所以非常清楚,当我提到上面的 "javaDoc" 时,我可能用词不当。我在写我自己的 类 时看到,以 /** 开头的注释紧接在将自身暴露为智能感知的方法之前,至少在 netbeans(也许是其他 IDE?)中是这样。因此,JLayeredPane 对象中 add() 方法的智能感知调用 (component cmpnt, int i) 作为参数。由于 intellisense 是我访问方法及其参数解释的第一个资源,因此我觉得这很混乱。也许这是一个疏忽,或者也许我对这个对象和方法有一些不理解的地方。无论哪种方式,将其作为 "Integer" 传递都有效。

让你走的事情嗯嗯。

也许对 JLayeredPane 对象非常熟悉的人可以解释这背后的原因。我当然不能。