Java JButtons中的图标是否未被删除?
我正在为Java游戏构建一个基于swing的GUI。游戏本质上是一个4x4网格,由自定义的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
单元格
对象组成,本质上是一个自定义的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);