以下是“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++;
}
}
答案 0 :(得分:1)
阅读How to Use Layered Pane上Swing教程中的部分以获取工作示例。较低编号的图层在较高编号的图层之前绘制。
相反,如果使用分层窗格,可能是使用支持组件重叠的布局管理器的更好解决方案。查看Overlap Layout以获取支持此功能的布局管理器。
每张卡片都显示在上一张卡片下方
lp.setLayout(new FlowLayout());
您没有正确使用分层窗格。使用FlowLayout时,组件的绘制顺序与组件添加到面板的顺序相反。也许你可以摆脱设置布局声明。
无论如何,我给了你两个解决方案。
答案 1 :(得分:0)
发布答案,以防有人在搜索中遇到此问题。
在故障排除过程中,我想将zOrd添加到每个标签的文本中,以跟踪每张卡的z索引。为了做到这一点,我将zOrd的变量类型从int更改为Integer,因此我可以在其上调用.toString()方法。当我这样做时,它起作用了。起初我认为在标签上添加文字是产生差异的原因,但事实并非如此。我删除了.setText()方法并完全按照编写的方式使用了我的代码,除了将zOrd声明为整数副和一个int,它就可以了。为了加深这个谜团,JLayeredPane.add()方法的javaDoc甚至表示参数应该是(组件cmpnt,int i)。
编辑:我是JAVA的新手,所以当我提到" javaDoc"时,要非常清楚。上面,我可能使用了一个用词不当。我在编写自己的类时会看到以/ **开头的备注,它紧接在一个方法之前放置为intellisense,至少在netbeans(可能是其他IDE?)中。因此,JLayeredPane对象中的add()方法的intellisense将(component cmpnt,int i)作为参数调用。由于intellisense是第一个用于解释方法及其参数的资源,我发现这令人困惑。也许这是一种疏忽,或者也许我对这个对象和方法有所了解。无论哪种方式,将其作为" Integer"的工作原理。
让你感到高兴的事情。
也许非常熟悉JLayeredPane对象的人可以解释这背后的原因。我当然不能。