Java JButtons中的图标是否未被删除?

Java JButtons中的图标是否未被删除?,java,swing,repaint,Java,Swing,Repaint,我正在为Java游戏构建一个基于swing的GUI。游戏本质上是一个4x4网格,由自定义的单元格对象组成,本质上是一个自定义的JButton。代码如下 package gamePack; import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JButton; public class Cell extends JButton { int co_x = 0; int co_y = 0; Arra

我正在为Java游戏构建一个基于swing的GUI。游戏本质上是一个4x4网格,由自定义的
单元格
对象组成,本质上是一个自定义的JButton。代码如下

package gamePack;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JButton;

public class Cell extends JButton {

int co_x = 0;
int co_y = 0;

  ArrayList<Players> current = new ArrayList <Players>();
}
当点击移动按钮时,游戏会改变。在这里,当我单击开始时,我正在添加玩家的精灵,并调用重画方法。重画方法如下:

package gamePack;

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;


public class Redraw {



    public static void draw(JPanel gamePanel, Cell[][] panelHolder ){


        gamePanel.setBounds(0, 0, 365, 310);

        int i = 4;
        int j = 4;

        gamePanel.setLayout(new GridLayout(4, 4, 0, 0));
        //91.25 x 77.5 rectangles



        Border border = BorderFactory.createLineBorder(Color.white);
        for(int m = 0; m < i; m++) {
            for(int n = 0; n < j; n++) {
                panelHolder[m][n].setBackground(Color.black);
                panelHolder[m][n].setEnabled(false);
                panelHolder[m][n].setBorder(border);
                panelHolder[m][n].setIcon(null);

                for(Players p: panelHolder[m][n].current){
                    if(p instanceof PlayChar){
                        String arg = "Player.png";
                        ImageIcon icon = new ImageIcon(arg); 
                        JLabel label = new JLabel(); 
                        label.setIcon(icon); 
                        panelHolder[m][n].add(label);

                    } else if (p instanceof BattleStar) {
                        String arg = "BattleStar.png";
                        ImageIcon icon = new ImageIcon(arg); 
                        JLabel label = new JLabel(); 
                        label.setIcon(icon); 
                        panelHolder[m][n].add(label);
                    }   else if (p instanceof BattleCruiser){
                        String arg = "BattleCruiser.png";
                        ImageIcon icon = new ImageIcon(arg); 
                        JLabel label = new JLabel(); 
                        label.setIcon(icon); 
                        panelHolder[m][n].add(label);
                    } else if (p instanceof BattleShooter){
                        String arg = "BattleShooter.png";
                        ImageIcon icon = new ImageIcon(arg); 
                        JLabel label = new JLabel(); 
                        label.setIcon(icon); 
                        panelHolder[m][n].add(label);
                    } 
                }
            }
        }
        gamePanel.revalidate();
        gamePanel.repaint();
    }
}
打包游戏包;
导入java.awt.Color;
导入java.awt.GridLayout;
导入javax.swing.BorderFactory;
导入javax.swing.ImageIcon;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.border.border;
公共类重画{
公共静态无效绘制(JPanel游戏面板,单元格[][]面板持有人){
gamePanel.setBounds(0,0,365,310);
int i=4;
int j=4;
setLayout(新的GridLayout(4,4,0,0));
//91.25 x 77.5矩形
Border Border=BorderFactory.createLineBorder(颜色:白色);
对于(int m=0;m
redraw方法检查每个单元格中的ArrayList,然后适当地添加一个图标。此时,当我单击“移动”时,它应该删除所有jbutton,然后使用适当的精灵将它们添加回

问题是,当我这样做时,即使在添加另一个精灵之前使用
current.clear()。单步遍历代码表明没有调用
PlayChar
对象的if语句,因此我不得不假设这与redraw方法有关。我是不是做错了什么


编辑:根据反馈,我现在对其进行了更改,以便重画函数不会替换jbutton,而是更改其属性。我还添加了它,以便在设置任何图标之前,每个图标都设置为null,以确保将其删除。但是,相同的问题仍在发生

发现问题!感谢@faljbour


您使用JLabel并调用add来设置JButton上的图标而不是直接使用.setIcon(icon)有什么原因吗

这就是问题所在。图像被设置为JLabel,然后被添加,因此删除图标没有任何效果

代码应为:

String arg = "Player.png";
ImageIcon icon = new ImageIcon(arg);  
panelHolder[m][n].setIcon(icon); 

不管怎样。设置图标(null);,不要在运行时替换JComponents来使用,通过使用setIcon/Border/background来更改其属性…@mKorbel ok,因此我编辑了代码,使其不替换组件,而是更改组件,并添加到
setIcon(null)中在尝试将图标更改为其他图标之前运行。但是,它仍然会导致同样的问题。您使用JLabel并调用add来设置JButton上的图标,而不是直接使用.setIcon(icon)。@faljbour解决了这个问题,谢谢“它本质上是一个自定义JButton”使用一个标准(可能未修饰的)
JButton
和一个
ActionListener
。它将适用于键盘和鼠标。
String arg = "Player.png";
ImageIcon icon = new ImageIcon(arg);  
panelHolder[m][n].setIcon(icon);