Java - Problema para que el programa reconozca teclas del teclado

   
Vista:
Imágen de perfil de Diego

Problema para que el programa reconozca teclas del teclado

Publicado por Diego coliderdeadcastle@gmail.com (8 intervenciones) el 27/04/2015 14:34:32
Hola, buenas tardes y gracias de antemano por atender a mi duda que es la siguiente:

He intentado hacer un programa, en este mismo tenemos una pantalla en la que aparecerá un objeto y este podrá moverse, para mover el objeto hemos creado unos botones (Arriba, abajo, izquierda, derecha y Empezar) cuando pulsemos el botón con el ratón, el objeto aparecerá en el panel si pulsamos empezar o se moverá en la dirección y sentido que el botón dice(con los oros 4 botones), todo eso está resuelto pero ahora quiero que cuando pulse una tecla del teclado, en este caso "Enter" aparezca el objeto en el panel, para ello uso el siguiente códgio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
btnEmpezar = new JButton("Empezar");
btnEmpezar.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_ENTER)
        {
            t = new Bicho(10,50,50,50, "Imagenes/bichillo.jpg",10); //Posicion x, posicion y, alto, ancho, nombre, energia
            t.ColocarAleatorio(400, 250);  //Tamaño del panel
            g=panel.getGraphics();
            t.mostrar(g);
            Vida.setText(""+t.energy);
        }
 
    }
});

El problema es que cuando pulso "Enter" no pasa nada, no se crea nada ni nada en el Jpanel, ahora bien, si pulso el botón con el ratón si que se crea el objeto y si luego pulso la tecla "Enter" vuelve a crearse, pero la única manera de hacer que se cree el objeto es pulsando primero con el ratón el botón, ¿alguien sabe como puedo hacer para que pulsando la tecla "Enter" directamente se cree el objeto sin tener que pulsar el botón de empezar con el ratón previamente?

Gracias por la atención.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema para que el programa reconozca teclas del teclado

Publicado por Tom (912 intervenciones) el 27/04/2015 15:50:46
Estás añadiendo el keylistener al botón. La primera vez no funciona porque el botón no tiene el "focus" y, por tanto, no recibe ese evento. Una vez que lo pulsas, ya tiene el focus y entonces sí recibe el evento.

En principio, deberías añadir el keylistener al panel, no al botón.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego

Problema para que el programa reconozca teclas del teclado

Publicado por Diego coliderdeadcastle@gmail.com (8 intervenciones) el 27/04/2015 16:51:29
Vale, comprobado lo del foco es cierto que si coloco el foco sobre el botón empezar simplemente con darle a la tecla valdría pero no es una solución ya que habría que estar todo el rato cambiando el foco, he probado lo que me has comentado de añadir el keylistener al panel pero nada, no hace ninguna acción cuando pulso "Enter" . El código que he escrito es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Eventos del Panel
panel = new JPanel();
panel.addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_ENTER)
        {
            t = new Bicho(10,50,50,50, "Imagenes/bichillo.jpg",10); //Posicion x, posicion y, alto, ancho,...
            t.ColocarAleatorio(400, 250);  //Tamaño del panel
            g=panel.getGraphics();
            t.mostrar(g);
            Vida.setText(""+t.energy);
        }
    }
});

No sé si tal vez el código esté mal escrito pero no hace nada, gracias por la atención.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para que el programa reconozca teclas del teclado

Publicado por Tom (912 intervenciones) el 27/04/2015 17:00:07
Es lo mimso, el JPanel debe tener el foco ...

https://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego

Problema para que el programa reconozca teclas del teclado

Publicado por Diego coliderdeadcastle@gmail.com (8 intervenciones) el 27/04/2015 17:16:48
Vale, muchas gracias y siento las molestias, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para que el programa reconozca teclas del teclado

Publicado por Tom (912 intervenciones) el 27/04/2015 17:19:00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package lwp;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
/* */
public class TestFocus extends JFrame implements ActionListener {
	private JLabel textDisplay;
 
	/* */
	TestFocus() {
		super();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout());
		createComponents();
		pack();
		addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				textDisplay.setText("Pressed Key " + e.getKeyChar());
			}
		});
	}
	/* */
	private void createComponents() {
		JButton bt = new JButton("Press me");
 
		bt.setActionCommand("ButtonPress");
		bt.setFocusable(false);
		textDisplay = new JLabel();
		textDisplay.setPreferredSize(new Dimension(320, 200));
		add(textDisplay, BorderLayout.CENTER);
		add(bt, BorderLayout.SOUTH);
		bt.addActionListener(this);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if("ButtonPress".equals(e.getActionCommand())) {
			textDisplay.setText("Button Pressed!");
		}
	}
	/*^*/
	public static void main(String[] args) {
		new TestFocus().setVisible(true);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para que el programa reconozca teclas del teclado

Publicado por Tom (912 intervenciones) el 27/04/2015 17:59:01
Y otra forma, que no depende de qué componente tenga el foco, pero que podría interferir con el proceso normal deotros componentes (de entrada de texto, por ejemplo):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package lwp;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;
 
/* */
public class TestFocus extends JFrame implements ActionListener {
	private JLabel textDisplay;
 
	/* */
	TestFocus() {
		super();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout());
		createComponents();
		pack();
 
 
		getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ENTER"), "enterPressed");
		getRootPane().getActionMap().put("enterPressed", new AbstractAction() {
			@Override
			public void actionPerformed(ActionEvent e) {
				textDisplay.setText("Pressed ENTER key");
			}
		});
	}
	/* */
	private void createComponents() {
		JButton bt = new JButton("Press me");
 
		bt.setActionCommand("ButtonPress");
 
		textDisplay = new JLabel();
		textDisplay.setPreferredSize(new Dimension(320, 200));
 
		add(textDisplay, BorderLayout.CENTER);
		add(bt, BorderLayout.SOUTH);
 
		bt.addActionListener(this);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if("ButtonPress".equals(e.getActionCommand())) {
			textDisplay.setText("Button Pressed!");
		}
	}
	/*^*/
	public static void main(String[] args) {
		new TestFocus().setVisible(true);
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar