为什么我的 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 对象非常熟悉的人可以解释这背后的原因。我当然不能。
以下是 "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 对象非常熟悉的人可以解释这背后的原因。我当然不能。