2013-02-02 42 views
0

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

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(); 
     } 

    } 
} 
+1

我的猜测是,你不删除“JLabel”的正确实例。就我所知,你并没有保留对你添加到'JLayeredPane'中的'breakB'的引用,因此,除非你依靠一些糟糕的算法找回它,否则你正在删除一些实际上不存在的东西你的'JLayeredPane'。 –

+0

您没有为每个添加到'layeredPane'的JLabel'' breakB'提供'global access'。 ''''''''''''''''''''''''''''''''''''你从'layeredPane'中移除的'JLabel'实际上并不存在于'layeredPane'上,它只是'actionPerformed'内创建的'local''变量'因此,当'damageCount == 6'条件成为'true'时,实际上所期望的'JLabel'不会从'layeredPane'中移除。 –

+0

那么我应该让breakB成为一个全局变量还是什么? 编辑:好的,我让breakB一个全局变量,它现在工作。非常感谢! – splouk

回答

0

我想你遇到的问题是,你正在创建的actionPerformed方法本地标签的事实...

JLabel breakB = new JLabel(); 

这意味着,每次你进入方法,您正在创建标签的新实例,这意味着您在删除标签时不再提及任何现有标签。

考虑创建breakB变量的单个实例或保持某种形式的列表,所以你知道哪些需要拆除,如果你需要不止一个......