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();
}
}
}
내 생각 엔 당신이 제거되지 않는 것입니다 ...
breakB
변수의 단일 인스턴스를 생성 고려한다 당신이 하나 더 후 필요하면 사람이 제거 될 필요가있는 알 수 있도록 목록의 일종을 유지 JLabel의 적절한 인스턴스. 내가 볼 수있는 한,'JLayeredPane'에 추가하는'breakB'에 대한 참조를 유지하지 않으므로 일부 엉터리 알고리즘을 사용하여 그것을 찾지 않으면 실제로 존재하지 않는 것을 제거하게됩니다 'JLayeredPane'입니다. –당신은'layeredPane'에 추가 된 각'JLabel''breakB'에''전역 접근권 '을 제공하지 않았습니다. 그리고 실제로'layeredPane'에서 제거하는'JLabel'은'layeredPane'에 존재하지 않습니다.'actionPerformed' 내에 생성 된'local'' 변수입니다. 사실상,'damagedCount == 6 '이'true'가되면 원하는'JLabel'은'layeredPane'에서 제거되지 않습니다. –
그래서 breakB를 전역 변수로 만들어야합니까? EDIT : 좋아, 이제는 전역 변수 인 breakB를 만들었고 현재 작동 중입니다. 고마워요! – splouk