Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > keypressed e imágenes

Hola, a ver si alguien me hecha una mano. Estoy haciendo un programa que presenta diferentes imágenes y hace diferentes cálculos en función de diferentes teclas que han sido pulsadas, el problema me lo he encontrado muy al principio, en bucles de un keypressed, en relación a flujos, sobre todo ifs...el problema es que a escepción de la primera pulsación, en la segunda y siguientes el evento recorre el if del evento anterior, no se si me explico, si en la imagen 4 la tecla correcta es por ejemplo la d, esta se contabiliza correctamente pero contabiliza un error de la anterior imagen donde no era correcto introducir la tecla d.... Ya se que el método no presenta buen aspecto pero es la mejor forma que he encontrado por el momento (en realidad posteo una versión un poco más simple sin tanto número), se que por ejemplo para temas visuales suelen ponerse los if de las teclas de dirección y ya... pero de momento esta forma es más entendible.

imagenCargada = 0;
....
metodosimple(){
// IMAGEN 0 CARGADA
if (numeroImagenCargada == 0) {
if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_UP) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
imagen++;
Imagen[imagen] = new ImageIcon(getClass().getResource(
"/imagenes/imagen"+imagen+".JPG"));
jLabel1.setIcon(Imagen[imagen]);
aciertos++;
numeroImagenCargada = 1;
}
}
// IMAGEN 1 CARGADA
if (numeroImagenCargada == 1) {
if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_UP) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
errores++;
}
if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
imagen++;
Imagen[imagen] = new ImageIcon(getClass().getResource(
"/imagenes/imagen" + imagen + ".JPG"));
jLabel1.setIcon(Imagen[imagen]);
aciertos++;
numeroImagenCargada = 2;
}
}
......
}

He intentado "borrar" o limpiar la variable del evento cuando el método términa pero de igual forma al producirse el nuevo evento parece que primero se refleja el anterior

evt.setKeyCode(KeyEvent.VK_UNDEFINED);

¿alguna idea? Muchas gracias de antemano

abril 3, 2015 | Registered Commenterjdavid

Prueba cambiando el instante del evento, prueba en lugar de keyPressed, con keyReleased, alguna vez tuve una situación similar y con keyReleased, efectúa el evento luego de soltar la tecla y queda limpio el buffer.

abril 4, 2015 | Unregistered CommenterGerman Morocho

Probaría así, porque si no se cumple ninguna de las condiciones, el evento no se consume, y puede ser la causa del problema.

private void metodosimple() {
// IMAGEN 0 CARGADA
if (numeroImagenCargada == 0) {
switch (evt.getKeyCode()) {
case KeyEvent.VK_LEFT:
case KeyEvent.VK_UP:
case KeyEvent.VK_UP:
errores++;
break;
case KeyEvent.VK_RIGHT:
cargaImagen();
numeroImagenCargada = 1;
break;
}
// IMAGEN 1 CARGADA
} else if (numeroImagenCargada == 1) {
switch (evt.getKeyCode()) {
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
errores++;
break;
case KeyEvent.VK_LEFT:
cargaImagen();
numeroImagenCargada = 2;
break;
}
} else {
evt.consume();
}
}

private void cargaImagen() {
imagen++;
Imagen[imagen] = new ImageIcon(getClass().getResource("/imagenes/imagen" + imagen + ".JPG"));
jLabel1.setIcon(Imagen[imagen]);
aciertos++;
}

abril 4, 2015 | Registered Commenterchoces

Para mi sorpresa no funciona keyReleased (que me cambiaría los esquemas, pero esperaba que funcionara) ni el método consume(). No se aprecia cambio, que raro. Creo que la solución pasaría por borrar el objeto del evento y reconstruirlo, he probado

new addKeyListener((new KeyAdapter () {
@Override
public void keyPressed(KeyEvent evt) {
...

de momento nada, a excepción del primer evento, contabiliza errores en el resto, la cuestión es que tampoco encuentro mucha info del objeto en la documentación

abril 4, 2015 | Registered Commenterjdavid

He probado los eventos de teclado, como puedes ver en el código siguiente, con la última versión de JavaSE, y funcionan sin problemas.
Debe de haber algo en tu código que provoca lo que comentas.


public class NewJFrame extends javax.swing.JFrame {

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
jPanel1.setFocusable(true);
jPanel1.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
jPanel1.setBackground(Color.red);
break;
case KeyEvent.VK_UP:
jPanel1.setBackground(Color.blue);
break;
case KeyEvent.VK_DOWN:
jPanel1.setBackground(Color.black);
break;
case KeyEvent.VK_LEFT:
jPanel1.setBackground(Color.YELLOW);
break;
}
}

});
}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

jPanel1 = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 212, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 223, Short.MAX_VALUE)
);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

pack();
}// </editor-fold>

/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}

// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}

abril 4, 2015 | Registered Commenterchoces

ok, resulta que investigando porqué no funcionaba evt.setKeyCode(KeyEvent.VK_UNDEFINED);
si funciona, culpa de un bucle de otro hilo, en fin...
MORALEJA: Al loro con los hilos de números

abril 4, 2015 | Registered Commenterjdavid

Esquema para si otra persona está en esta cuestión:

private void formKeyPressed(java.awt.event.KeyEvent evt) {
comprobarPulsacion(evt);
}

void comprobarPulsacion(KeyEvent evt) {
if (condición_que_quieres) {
if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
metodoOpcionIncorrecta();
}
if (evt.getKeyCode() == KeyEvent.VK_UP) {
metodoOpcionIncorrecta();
}
if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
metodoOpcionIncorrecta();
}
if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
metodoOpciónCorrecta();
}
ifs_de_otro_tipo...{
...}
evt.setKeyCode(KeyEvent.VK_UNDEFINED);
}

abril 4, 2015 | Registered Commenterjdavid

Muchas gracias :)

abril 4, 2015 | Registered Commenterjdavid