【问题标题】:Why isn't my JLayeredPane respecting the Z index in this method?为什么我的 JLayeredPane 在此方法中不尊重 Z 索引?
【发布时间】:2015-03-24 16:01:01
【问题描述】:

以下是“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++;
    }
}

【问题讨论】:

  • the cards appear in the reverse order that I wish them to. - 你希望它们如何出现?我们不是读心术的人。发布一个正确的SSCCE 来证明问题。在创建SSCCE 时,您可能会发现问题。
  • 我应该更清楚。每张卡片都出现在前一张卡片的下方。我希望它出现在上一张卡片的顶部。
  • 您不应该设置分层窗格的布局。不知道这是不是唯一的问题。阅读我的建议。其中之一将解决您的问题。

标签: java swing jlayeredpane


【解决方案1】:

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

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

每张卡片都出现在前一张卡片的下方

lp.setLayout(new FlowLayout()); 

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

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

【讨论】:

  • 原来我没有这条线。我添加了它,认为也许我需要明确定义布局,因为我在运行时创建 JLayeredPane。我已经把它拿回来了。另外,我尝试减少 zOrd 变量而不是增加它。这些东西都不起作用。 flowlayout 不是默认布局吗?
  • @Camenwolf, Neither of those things worked - 本教程有一个工作示例。阅读教程,下载示例代码并使用它,以便您了解如何使用分层窗格。我不能根据几行代码告诉你你的代码有什么问题。关于我使用Overlap Layout 的第二个建议,我忘记包含示例代码的链接。这是比使用分层窗格更简单的解决方案。您只需使用带有自定义布局的 JPanel。更新答案以包含链接。
  • 感谢您抽出宝贵时间阅读并回答我的问题。不过,本质上,您是在告诉我去阅读教程并进行实验,直到我弄明白为止。我很欣赏这个合理的建议,它可以应用于这里提出的大多数问题。像大多数人一样,我在定期检查这个网站时正在阅读和试验。我确实相信我提供的代码是与我的问题相关的代码。我希望对我调用的对象和方法有透彻理解的人能够根据这段代码回答我的问题。
  • I do believe that the code that I've supplied is the code that is relevant to my issue. - 在问题解决之前,您不知道什么是相关的或不相关的,这就是为什么最初要求您提供SSCCESSCCE 是一个重要的问题解决工具。如果你不能努力,那我们为什么要努力?你说你的代码以前工作过,所以比较工作代码。不仅如此,我还通过使用专为满足您的需求而设计的自定义布局为您提供了一个简单的解决方案。
【解决方案2】:

发布答案以防有人在搜索中偶然发现此问题。

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

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

让你兴奋的事情。

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

【讨论】:

  • the javaDoc for the JLayeredPane.add() method even says that the parameters are supposed to be (component cmpnt, int i). - 不,它没有。 JLayeredPane 不会覆盖 Container.add(..) 方法。 add(..) 方法仅用于将组件添加到面板。它与组件的分层无关。这就是我向您指出本教程的原因。本教程清楚地使用整数值。这在 JLayeredPane API 一般描述区域中也有明确记录。
  • 好的。当我键入此内容时,我正在查看 netbeans。我有一个带有等待参数的 add 方法的 LayeredPane 对象的实例。弹出的智能感知告诉我它需要参数(组件 cmpnt,int i)。对我来说,这是一种误导,因为如果我使用 int Vice Integer 它不尊重 Z 索引。这就是我的问题的答案。不是“去阅读教程”。如果其他人发现这令人困惑,希望这个答案会有所帮助。感谢您的 cmets,但我的问题已得到解答。
  • To me, this is misleading 那是你的 IDE,而不是 Swing。您应该了解您正在做的事情的基础知识。 So that is the answer to my question. Not "go read the tutorial." - 是的,但不要指望人们会用勺子喂你答案。本教程有一个工作示例。我告诉过你,首先绘制较低数量的图层。这个想法是让您查看教程以了解这是如何完成的。这是学习如何自己解决问题的一部分。 “授人以鱼一日,授人以渔”。
  • 如果您知道我的问题的答案,是的,我希望并期待它被用勺子喂给我。就像我阅读一个我知道答案的问题时会做的那样。这是一个支持论坛,伙计,专业人士为了获得他们没有的知识而相互联系,通常是在某些项目或其他项目的胁迫下。不是嬉皮士的公社,他们寻求关于如何成长为一个人的无限禅宗智慧。你不知道答案,所以停止所有居高临下的打蜡。这里有一点值得深思。我怎么让你激怒我,这激怒了我。你能停止发布我的问题吗?
  • 我根据明显的努力回答了一个问题。您没有阅读 JLayeredPane API。它特别声明您使用整数。你没有看教程,它明确地使用了一个整数。您没有发布 SSCCE。你没有做出明显的努力,所以,不,我不会用勺子喂答案。 for professionals who come to one another for knowledge they don't have, 专业人士有知识首先查看 API 或阅读示例代码,这些代码完全符合当时的要求。专业人士想知道如何解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2015-09-17
  • 2012-01-14
  • 2020-10-11
  • 2016-11-26
  • 1970-01-01
相关资源
最近更新 更多