У меня этот класс:
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");
}
В основном я создаю игру: сетка цветных JButtons, когда игрок пытается нажать на два JB, чтобы переключить цвет между ними.
Проблема в том, что я получаю 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 теряет свои свойства, когда действие не соответствует ему?
Любые объяснения, пожалуйста?
EDIT Я изменил 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 становится нулевым?
Я решил проблему, это просто изменило gemme1/gemme2 на статичный, чтобы стать общим для других экземпляров Gemme:
private static Gemme gemme1;
private static Gemme gemme2;
if(this.indicateur==1)//first click
{
this.gemme1 = (Gemme) e.getSource();
}
else
{
this.gemme2 = (Gemme) e.getSource();
switchColor();
}
В этом коде вы инициализируете gemme2
член gemme2
. Когда вы вызываете switchColor()
в блоке else
, gemme1
остается неопределенным, например, null. Вот почему вы получаете NPE во время gemme1.getBackground();
вызов.