【问题标题】:Deleting a JLabel from a JLayeredPane从 JLayeredPane 中删除 JLabel
【发布时间】:2013-02-02 18:42:01
【问题描述】:

我有一个分层窗格,其中包含各种动画。我正在使用 Jlabel (breakB) 在正在破坏的块上显示破坏动画。当块破裂时,问题就出现了。标签应该消失,但它仍然可见。我一直在寻找解决方案几个小时,真的不知道发生了什么,所以任何帮助将不胜感激。

class breakBlock implements ActionListener {
    public void actionPerformed(ActionEvent e) {


        damageCount+=1;
        System.out.println(damageCount);
        JLabel breakB = new JLabel();
        ImageIcon breakIcon = new ImageIcon();


        if(digDown){
            blockInt = standingOn;
        } else {blockInt = nextTo;}


        if(damageCount == 1){
            breakIcon =  new ImageIcon(break01);

        }

        if(damageCount == 2){
            breakIcon =  new ImageIcon(break02);
        }

        if(damageCount == 3){
            breakIcon =  new ImageIcon(break03);

        }

        if(damageCount == 4){ 
            breakIcon =  new ImageIcon(break04);
        }

        if(damageCount == 5){
            breakIcon =  new ImageIcon(break05);
        }


        breakB.setIcon(breakIcon);
        breakB.setBounds(solidObjects.get(blockInt).getX(), solidObjects.get(blockInt).getY(), breakIcon.getIconHeight(), breakIcon.getIconWidth());
        layeredPane.add(breakB, new Integer(2), 0);

        if(damageCount == 6){
            layeredPane.remove(solidObjects.get(blockInt));
            layeredPane.remove(breakB);
            layeredPane.repaint(); // sometimes needed
            solidObjects.remove(blockInt);
            damageCount = 0;
            breakBlock.stop();
        }

    }
}

【问题讨论】:

  • 我的猜测是您没有删除您的JLabel 的正确实例。据我所见,您没有保留要添加到 JLayeredPanebreakB 的引用,因此,除非您依靠一些糟糕的算法来找回它,否则您正在删除实际上不在其中的东西你的JLayeredPane
  • 您尚未将global access 提供给添加到layeredPane 的每个JLabel breakB。而您从 layeredPane 中删除的 JLabel 实际上在 layeredPane 上并不存在,它只是在 actionPerformed 内创建的 local variable 。所以事实上,当条件damageCount == 6 变为true 时,所需的JLabel 不会从layeredPane 中删除。
  • 那么我应该让 breakB 成为全局变量还是什么?编辑:好的,所以我将 breakB 设为全局变量,它现在正在工作。非常感谢!
  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing jlabel imageicon jlayeredpane


【解决方案1】:

我认为您遇到的问题是您在 actionPerformed 方法中创建本地标签...

JLabel breakB = new JLabel();

这意味着,每次您进入该方法时,您都在创建标签的一个新实例,这意味着您在移除它时不再引用任何现有标签。

考虑创建breakB 变量的单个实例或维护某种列表,以便您知道需要删除哪些列表,如果您需要多个...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多