Disculpa la demora, no he estado en el foro los últimos días.
Veo que no has podido realizarlo, bien aquí te dejo el code. Básicamente lo que hago es crear un JPanel y una Controladora de los Eventos, luego las asocio. Esto, para que los eventos se desencadenen sin interferir con la vista. Cuando se presiona una tecla, la capturo con
getKeyChar(), luego en un switch comparo con los posibles resultados. Si es 'm' o 'M' crea y ejecuta un thread, y si es 's' o 'S', el thread de se detendrá. Si se vuelve a presionar 'm' o 'M', se volverá a crear y a ejecutar un nuevo thread.
Te dejo el código ya comentado, para que lo entiendas.
JFrame y JPanel:import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class KeyListenerGraphicsDemo
extends JFrame {
public KeyListenerGraphicsDemo() {
init();
}
private void init() {
this.setTitle("Demo Graphics and KeyListener");
this.setVisible(true);
this.setSize(400,300);
this.
setDefaultCloseOperation(JFrame.
DISPOSE_ON_CLOSE); this.add(new PanelGrafico());
}
public class PanelGrafico
extends JPanel {
private float radio = 35f;
private int ancho = 60, alto = 180;
private int dirX = ancho % 10 +5;
private int dirY = alto % 10 +1;
DriverEvents driver = new DriverEvents(this);
public PanelGrafico() {
// hace el panel focusable para que pueda implementar
// KeyListener, ya que por defecto no es focusable
this.setFocusable(true);
this.addKeyListener(driver); // asocia el panel con el driver
}
@Override
public void paintComponent
(Graphics g
) { super.paintComponent(g);
// utiliza el metodo mover la dibujar
g2.fillOval((int)(ancho - radio),(int)(alto - radio), (int)(radio*2),(int) (radio*2));
}
// mueve la pelota a lo largo del marco
public void mover() {
ancho += dirX;
alto += dirY;
//Controlo que cuando toca el borde, cambie de direccion
if ((ancho-radio) <= 0)
dirX*= -1;
else if ((ancho+radio) >= getWidth())
dirX*= -1;
if ((alto-radio) <= 0)
dirY*= -1;
else if ((alto+radio) >= getHeight())
dirY*= -1;
this.repaint();
}
}
}
Driver de los eventos del JPanel:import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import source.KeyListenerGraphicsDemo.PanelGrafico;
private final PanelGrafico panel; // maneja el panel
private byte cantidadThreads = 0; // cantidad de threads
private boolean correr = true; // condicion del thread
public DriverEvents(PanelGrafico panel) {
this.panel = panel;
}
// recupera el caracter de la letra y ejecuta el thread
// en caso se presione la letra correcta
@Override
char letterPress = e.getKeyChar();
switch(letterPress) {
case 'M':
case 'm': correr = true; start(); break;
case 'S':
case 's': correr = false; cantidadThreads = 0; break;
}
}
// si no hay threads en ejecucion, crea uno nuevo y lo ejecuta
private void start() {
cantidadThreads++;
if (cantidadThreads <= 1) {
PaintThread thread = new PaintThread();
thread.start();
}
}
@Override
}
@Override
}
// Thread
public class PaintThread
extends Thread {
@Override
public void run() {
while(correr == true) {
panel.mover();
panel.repaint();
}
}
}
}
Main:import javax.swing.SwingUtilities;
public class Main {
public static void main
(String...
args) { @Override
public void run(){
new KeyListenerGraphicsDemo();
}
});
}
}
Como ves no es nada difícil. Espero te haya servido.
Saludos.