2013-02-02 2 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

내 생각 엔 당신이 제거되지 않는 것입니다 ... breakB 변수의 단일 인스턴스를 생성 고려한다 당신이 하나 더 후 필요하면 사람이 제거 될 필요가있는 알 수 있도록 목록의 일종을 유지 JLabel의 적절한 인스턴스. 내가 볼 수있는 한,'JLayeredPane'에 추가하는'breakB'에 대한 참조를 유지하지 않으므로 일부 엉터리 알고리즘을 사용하여 그것을 찾지 않으면 실제로 존재하지 않는 것을 제거하게됩니다 'JLayeredPane'입니다. –

+0

당신은'layeredPane'에 추가 된 각'JLabel''breakB'에''전역 접근권 '을 제공하지 않았습니다. 그리고 실제로'layeredPane'에서 제거하는'JLabel'은'layeredPane'에 존재하지 않습니다.'actionPerformed' 내에 생성 된'local'' 변수입니다. 사실상,'damagedCount == 6 '이'true'가되면 원하는'JLabel'은'layeredPane'에서 제거되지 않습니다. –

+0

그래서 breakB를 전역 변수로 만들어야합니까? EDIT : 좋아, 이제는 전역 변수 인 breakB를 만들었고 현재 작동 중입니다. 고마워요! – splouk

답변

0

나는 때마다 당신이에 오는 것을,이 의미

JLabel breakB = new JLabel(); 

... 당신이 발생하는 문제가 당신이 actionPerformed 방법에 지역 레이블을 만드는 사실 생각 메서드를 사용하여 레이블의 새 인스턴스를 만들면 기존 레이블을 제거 할 때 더 이상 참조 할 필요가 없습니다.