我是这堂课:
public class Gemme extends JButton implements ActionListener{
private static int indicateur=0;
private Gemme gemme1;
private Gemme gemme2;
@Override
public void actionPerformed(ActionEvent e) {
indicateur = 1-indicateur;
if(this.indicateur==1)//first click
{
this.gemme1 = (Gemme) e.getSource();
}
else
{
this.gemme2 = (Gemme) e.getSource();
switchColor();
}
}
private void switchColor()
{
Color c = gemme1.getBackground();
gemme1.setBackground(gemme2.getBackground());
gemme1.setBackground(c);
System.out.println("color switched");
}
基本上我创造了一个游戏: 当玩家尝试点击两个JB以便在它们之间切换颜色时,有色JButton的网格。
我在这条线上获得NPE的问题:
Color c = gemme1.getBackground();
但是当我把Color c = gemme1.getBackground();
放在actionPerformed中时:
public void actionPerformed(ActionEvent e) {
indicateur = 1-indicateur;
if(this.indicateur==1)//first click
{
this.gemme1 = (Gemme) e.getSource();
Color c = gemme1.getBackground();
}
else
{
this.gemme2 = (Gemme) e.getSource();
//switchColor();
}
}
它有效,我不明白,当动作与它不匹配时,JB是否正在失去他的属性?
请问有什么解释吗?
修改 我将switchColor()更改为:
private void switchColor()
{
System.out.println(gemme1);
System.out.println(gemme2);
}
输出:
null
mini.projet.dev.game.components.Gemme[btn42,104,216,51x53,alignmentX=0.0,alignmentY=0.5,b...........
gemme1如何变为空?
答案 0 :(得分:0)
我解决了这个问题,它只是将gemme 1 / gemme 2更改为静态,以便在其他Gemme实例之间共享:
private static Gemme gemme1;
private static Gemme gemme2;
答案 1 :(得分:0)
if(this.indicateur==1)//first click
{
this.gemme1 = (Gemme) e.getSource();
}
else
{
this.gemme2 = (Gemme) e.getSource();
switchColor();
}
在此代码中,您只是初始化gemme2
成员。当您在switchColor()
区块中致电else
时,gemme1
仍然未定义,例如空值。这就是gemme1.getBackground();
来电期间获得NPE的原因。