Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Cambio de JPanel invalida KeyListener

Buenas tardes!!!

Estoy desarrollando un programilla de un juego de marcianos y tengo un problemilla con el que quizás podáis echarme una mano.

Tengo un jpanel (menu inicial) con un mouselistener que carga unas imágenes de nivel y espera al evento para detectar que imagen ha sido pulsada. Trás ello, se elimina a si mismo del jframe padre y añade otro jpanel (juego) con un keylistener. El problema que tengo es que el segundo jpanel no reacciona con el listener cuando lo invoco desde la clase del menu, primer jpanel. En cambio, si la inicio directamente desde la clase jframe si funciona el keylistener, la nave se mueve y dispara.

Es curioso, porque cuando te matan o ganas vuelve a aparecer el menu inicial, que es añadido al jpanel de la misma forma que hacia con el juego, segundo jpanel, desde el menu inicial, primer jpanel. Al aparecer el menu inicial, si funciona el mouselistener.

Por ello no consigo dar con el problema, porque entendería que algo estaría realizando mal en la carga del jpanel si el mouselistener no funcionara tampoco cuando es iniciado su jpanel desde otro jpanel. Pero este si funciona, y en cambio el juego deja de escuchar al teclado si lo inicio desde el otro jpanel....


¿Podéis ayudarme a encontrar el problema???


Muchas gracias!!!!!

public class RType extends JFrame
{
private JPanel menuInicial;

public RType() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
muestraMenu();
}

public void muestraMenu()
{
menuInicial = new MenuInicial();
//ESTA LINEA INICIA EL JUEGO O menuInicial. SI INICIA EL JUEGO (VENTANA), EL KEYLISTENER FUNCIONA
this.add(new Ventana(3), BorderLayout.CENTER);
this.pack();
this.setSize(1000, 550);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setVisible(true);
}

public static void main(String [] args)
{
RType gameInstance = new RType();
}
}

public class MenuInicial extends JPanel
{
private JLabel imgFacil = new JLabel();
private JLabel imgNormal = new JLabel();
private JLabel imgImposible = new JLabel();
private JLabel imgComplicado = new JLabel();
private JLabel imgSelecciona = new JLabel();

private static final int POSICION_Y_FACIL = 147;
private static final int POSICION_X_FACIL = 219;
private static final int POSICION_Y_NORMAL = 222;
private static final int POSICION_X_NORMAL = 193;
private static final int POSICION_Y_SELECCIONA = 52;
private static final int POSICION_X_SELECCIONA = 56;
private static final int POSICION_Y_COMPLICADO = 297;
private static final int POSICION_X_COMPLICADO = 147;
private static final int POSICION_Y_IMPOSIBLE = 372;
private static final int POSICION_X_IMPOSIBLE = 173;

/**
* Constructor for objects of class MenuInicial
*/
public MenuInicial()
{
Toolkit t = Toolkit.getDefaultToolkit();
setSize(550, 550);
setLayout(null);
setBackground(Color.white);

imgSelecciona.setIcon(new ImageIcon("Images/Selecciona.png"));
add(imgSelecciona);
imgSelecciona.setBounds(POSICION_X_SELECCIONA, POSICION_Y_SELECCIONA, 437, 53);

imgFacil.setIcon(new ImageIcon("Images/Facil.png"));
imgFacil.addMouseListener(new MyMouseListener());
imgFacil.setName("Facil");
add(imgFacil);
imgFacil.setBounds(POSICION_X_FACIL, POSICION_Y_FACIL, 111, 49);

imgNormal.setIcon(new ImageIcon("Images/Normal.png"));
imgNormal.addMouseListener(new MyMouseListener());
imgNormal.setName("Normal");
add(imgNormal);
imgNormal.setBounds(POSICION_X_NORMAL, POSICION_Y_NORMAL, 164, 49);

imgComplicado.setIcon(new ImageIcon("Images/Complicado.png"));
imgComplicado.addMouseListener(new MyMouseListener());
imgComplicado.setName("Complicado");
add(imgComplicado);
imgComplicado.setBounds(POSICION_X_COMPLICADO, POSICION_Y_COMPLICADO, 255, 47);

imgImposible.setIcon(new ImageIcon("Images/Imposible.png"));
imgImposible.addMouseListener(new MyMouseListener());
imgImposible.setName("Imposible");
add(imgImposible);
imgImposible.setBounds(POSICION_X_IMPOSIBLE, POSICION_Y_IMPOSIBLE, 204, 49);
}

public void iniciaJuego(int nivel)
{
JFrame frame = (JFrame)this.getTopLevelAncestor();
frame.remove(this);
frame.add(new Ventana(nivel), BorderLayout.CENTER);
frame.pack();
frame.setSize(1000, 550);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public class MyMouseListener extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
JLabel origen = (JLabel)e.getSource();
if(origen.getName() == "Facil")
{
iniciaJuego(1);
}
if(origen.getName() == "Normal")
{
iniciaJuego(2);
}
if(origen.getName() == "Complicado")
{
iniciaJuego(3);
}
if(origen.getName() == "Imposible")
{
iniciaJuego(4);
}
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
}

public void mouseExited(MouseEvent e) {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
}

public class Ventana extends JPanel implements ActionListener
{
/*****************************
* Declaration Variable Zone *
*****************************/
private int level = 0;
private int counter = 0;
private boolean visibleGrupo1;
private boolean visibleGrupo2;
private boolean visibleGrupo3;
private boolean visibleGrupo4;
private boolean winner = false;
private boolean gameOver = false;
private boolean algunoVisible = true;
private Image youWin = Toolkit.getDefaultToolkit().getImage("Images/winner.png");
private Image gameOverImage = Toolkit.getDefaultToolkit().getImage("Images/game-over.png");

/*****************************
* Declaration Constant Zone *
*****************************/
protected static final int WIDTH_WINNER = 400;
protected static final int HEIGHT_WINNER = 300;
protected static final int WIDTH_GAME_OVER = 300;
protected static final int HEIGHT_GAME_OVER = 150;
protected static final int LIMIT_Y_POSITION = 550;
protected static final int LIMIT_X_POSITION = 1000;

/***************************
* Declaration Object Zone *
***************************/
Background background;
Spacecraft spacecraft;
JLabel pressSpace = new JLabel("Press space to return Menu.");
ArrayList<Martian> martianGroup1;
ArrayList<Martian> martianGroup2;
ArrayList<Martian> martianGroup3;
ArrayList<Martian> martianGroup4;

/********************
* Auxiliar Objects *
********************/
Timer timer;

public Ventana(int level)
{
this.level = level;
this.addKeyListener(new KeyboardInterface());
setFocusable(true);
setDoubleBuffered(true);

if (level >= 1) { initializeMartianGroup1(); }
if (level >= 2) { initializeMartianGroup2(); }
if (level >= 3) { initializeMartianGroup3(); }
if (level == 4) { initializeMartianGroup4(); }

background = new Background();
spacecraft = new Spacecraft();

timer = new Timer(5, this);
timer.start();
}


public void paint(Graphics g)
{
super.paint(g);

if (gameOver)
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
g.drawImage(gameOverImage, ((LIMIT_X_POSITION/2) - (WIDTH_GAME_OVER/2)), ((LIMIT_Y_POSITION/2) - (HEIGHT_GAME_OVER/2)), this);
}
else
{
if (algunoVisible == true)
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
switch(counter)
{

case 0: paintMartians(g, martianGroup1); break;
case 1: paintMartians(g, martianGroup2); break;
case 2: paintMartians(g, martianGroup3); break;
case 3: paintMartians(g, martianGroup4); break;
default: break;
}
paintShots(g);
g.drawImage(spacecraft.getImage(), spacecraft.getX(), spacecraft.getY(), this);
}
else
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
g.drawImage(youWin, ((LIMIT_X_POSITION/2) - (WIDTH_WINNER/2)), ((LIMIT_Y_POSITION/2) - (HEIGHT_WINNER/2)), this);
winner = true;
}
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}

public void actionPerformed(ActionEvent e)
{
switch(counter)
{
case 0: moveMartians(martianGroup1, 1); checkCollisions(martianGroup1); break;
case 1: moveMartians(martianGroup2, 2); checkCollisions(martianGroup2); break;
case 2: moveMartians(martianGroup3, 3); checkCollisions(martianGroup3); break;
case 3: moveMartians(martianGroup4, 4); checkCollisions(martianGroup4); break;
default: break;
}

ArrayList<Shot> activeShots = spacecraft.getShots();

for (int i = 0; i

mayo 21, 2013 | Unregistered CommenterNeoff

Parece que la ultima clase no entró al completo, la adjunto de nuevo.

public class Ventana extends JPanel implements ActionListener
{
/*****************************
* Declaration Variable Zone *
*****************************/
private int level = 0;
private int counter = 0;
private boolean visibleGrupo1;
private boolean visibleGrupo2;
private boolean visibleGrupo3;
private boolean visibleGrupo4;
private boolean winner = false;
private boolean gameOver = false;
private boolean algunoVisible = true;
private Image youWin = Toolkit.getDefaultToolkit().getImage("Images/winner.png");
private Image gameOverImage = Toolkit.getDefaultToolkit().getImage("Images/game-over.png");

/*****************************
* Declaration Constant Zone *
*****************************/
protected static final int WIDTH_WINNER = 400;
protected static final int HEIGHT_WINNER = 300;
protected static final int WIDTH_GAME_OVER = 300;
protected static final int HEIGHT_GAME_OVER = 150;
protected static final int LIMIT_Y_POSITION = 550;
protected static final int LIMIT_X_POSITION = 1000;

/***************************
* Declaration Object Zone *
***************************/
Background background;
Spacecraft spacecraft;
JLabel pressSpace = new JLabel("Press space to return Menu.");
ArrayList<Martian> martianGroup1;
ArrayList<Martian> martianGroup2;
ArrayList<Martian> martianGroup3;
ArrayList<Martian> martianGroup4;

/********************
* Auxiliar Objects *
********************/
Timer timer;

public Ventana(int level)
{
this.level = level;
this.addKeyListener(new KeyboardInterface());
setFocusable(true);
setDoubleBuffered(true);

if (level >= 1) { initializeMartianGroup1(); }
if (level >= 2) { initializeMartianGroup2(); }
if (level >= 3) { initializeMartianGroup3(); }
if (level == 4) { initializeMartianGroup4(); }

background = new Background();
spacecraft = new Spacecraft();

timer = new Timer(5, this);
timer.start();
}

public void initializeMartianGroup1()
{
visibleGrupo1 = true;
martianGroup1 = new ArrayList<Martian>();
if (martianGroup1.isEmpty() == false)
{
martianGroup1.clear();
}

for (int position=0; position < 10; position++)
{
martianGroup1.add(position, new MartianGroup1(position));
}
}

public void initializeMartianGroup2()
{
visibleGrupo2 = true;
martianGroup2 = new ArrayList<Martian>();
if (martianGroup2.isEmpty() == false)
{
martianGroup2.clear();
}

for (int position=0; position < 5; position++)
{
martianGroup2.add(position, new MartianGroup2(position));
}
}

public void initializeMartianGroup3()
{
visibleGrupo3 = true;
martianGroup3 = new ArrayList<Martian>();
if (martianGroup3.isEmpty() == false)
{
martianGroup3.clear();
}

for (int position=0; position < 5; position++)
{
martianGroup3.add(position, new MartianGroup3(position));
}
}

public void initializeMartianGroup4()
{
visibleGrupo4 = true;
martianGroup4 = new ArrayList<Martian>();
if (martianGroup4.isEmpty() == false)
{
martianGroup4.clear();
}

for (int position=0; position < 10; position++)
{
martianGroup4.add(position, new MartianGroup4(position));
}
}

public void paint(Graphics g)
{
super.paint(g);

if (gameOver)
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
g.drawImage(gameOverImage, ((LIMIT_X_POSITION/2) - (WIDTH_GAME_OVER/2)), ((LIMIT_Y_POSITION/2) - (HEIGHT_GAME_OVER/2)), this);
}
else
{
if (algunoVisible == true)
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
switch(counter)
{

case 0: paintMartians(g, martianGroup1); break;
case 1: paintMartians(g, martianGroup2); break;
case 2: paintMartians(g, martianGroup3); break;
case 3: paintMartians(g, martianGroup4); break;
default: break;
}
paintShots(g);
g.drawImage(spacecraft.getImage(), spacecraft.getX(), spacecraft.getY(), this);
}
else
{
g.drawImage(background.getImage(), background.getX(), background.getY(), this);
g.drawImage(youWin, ((LIMIT_X_POSITION/2) - (WIDTH_WINNER/2)), ((LIMIT_Y_POSITION/2) - (HEIGHT_WINNER/2)), this);
winner = true;
}
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}

public void actionPerformed(ActionEvent e)
{
switch(counter)
{
case 0: moveMartians(martianGroup1, 1); checkCollisions(martianGroup1); break;
case 1: moveMartians(martianGroup2, 2); checkCollisions(martianGroup2); break;
case 2: moveMartians(martianGroup3, 3); checkCollisions(martianGroup3); break;
case 3: moveMartians(martianGroup4, 4); checkCollisions(martianGroup4); break;
default: break;
}

ArrayList<Shot> activeShots = spacecraft.getShots();

for (int i = 0; i martians)
{
Martian martianInUse;
Iterator<Martian> martianIterator = martians.iterator();
while(martianIterator.hasNext())
{
martianInUse = martianIterator.next();
if (martianInUse.getVisible() == true)
{
g.drawImage(martianInUse.getImage(), martianInUse.getX(), martianInUse.getY(), this);
}
}
}


public void paintShots(Graphics g)
{
ArrayList<Shot> activeShots = spacecraft.getShots();

for (int i = 0; i martians, int group)
{
Martian martianInUse;
int martianCounter = 0;
boolean visible = false;
boolean restart = false;


Iterator<Martian> martianIterator = martians.iterator();
while(martianIterator.hasNext())
{
martianInUse = martianIterator.next();
if (martianInUse.getVisible()) { visible = true; }
martianInUse.move(martianCounter);
if ((!martianIterator.hasNext()) && (martianInUse.getX() == (-57)) && (visible))
{
int martianCounter2 = 0;
Iterator<Martian> martianIterator2 = martians.iterator();
while(martianIterator2.hasNext())
{
martianIterator2.next().restart(martianCounter2);
martianCounter2++;
}
restart = true;
}
martianCounter++;
}
if (!visible || restart)
{
switch(group)
{
case 1: if (group == level) { if (!visible) { algunoVisible = false; } }
else { counter++; if(!visible) { visibleGrupo1 = false; } }
break;
case 2: if (group == level) { counter = 0; if (!visible) { visibleGrupo2 = false; }; if(!visibleGrupo2 && !visibleGrupo1) { algunoVisible = false; } }
else { counter++; if(!visible) { visibleGrupo2 = false; } }
break;
case 3: if (group == level) { counter = 0; if (!visible) { visibleGrupo3 = false; }; if(!visibleGrupo3 && !visibleGrupo2 && !visibleGrupo1) { algunoVisible = false; } }
else { counter++; if(!visible) { visibleGrupo3 = false; } }
break;
case 4: counter = 0; if (!visible) { visibleGrupo4 = false;};
if(!visibleGrupo4 && !visibleGrupo3 && !visibleGrupo2 && !visibleGrupo1)
{
algunoVisible = false;
}
break;
default: break;
}
}
}


public void checkCollisions(ArrayList<Martian> martians)
{
Rectangle r3 = spacecraft.getBounds();

for (int i = 0; i < martians.size(); i++)
{
Rectangle r2 = martians.get(i).getBounds();

if(martians.get(i).getVisible())
{
if (r3.intersects(r2))
{
gameOver = true;
}
}
}

ArrayList<Shot> activeShots = spacecraft.getShots();

for (int j = 0; j

mayo 21, 2013 | Unregistered CommenterNeoff

hola @Neoff
bueno por lo que entiendo tu programa deja de escuchar al teclado mientra avanza entre niveles de tu juego?,
bueno por lo que veo cada nivel hace una ventana nueva y creo que el problema es que pierdes el foco, yo lo que hago es que el objeto keylistener se lo añado al frame y no al panel con esto al seleccionar (activar ) la ventana me aseguro que siempre tendré el foco , que darle el foco al panel bueno a mi en lo personal he tenido problemas

por lo que veo la forma en que añades el key listener
this.addKeyListener(new KeyboardInterface());
me imagino que tienes una clase donde controlas el teclado y no importa el nivel que estés siempre se hace lo mismo?
bueno si es así ponlo en el frame, me gustaría ver tu codigo de tu clase KeyboardInterface

mayo 21, 2013 | Registered Commenterjhosep