1
C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más / Java mover circulo en pantalla Graphics2D según eventos teclado KeyAdapter Timer
« en: 17 de Noviembre 2015, 00:45 »
Hola! Estoy practicando/aprendiendo en Java y he hecho un pequeño ejercicio que consta de poder mover una bola con el teclado(con las flechas de direccion), si dejo de pulsar las flechas del teclado, la bola sigue su curso, y si llega al borde del panel la bola rebota y cambia de direccion. Hasta aquí todo correcto, de hecho me funciona correctamente.....
.... PERO mi duda es como lo puedo hacer mediante la clase Thread. En este ejercicio uso basicamente la clase Timer para el movimiento de la pelota y las clases keyReleased y keyPressed para poder cambiar la direccion de la pelota por teclado. Pero mi intensión es hacerlo con Thread en lugar de con Timer y mantener keyReleased y keyPressed para poder dirigir la direccion de la bola.
Además tengo otra duda, tengo entendido que(sobre eventos) la clase ActionListener solo sirve para llevar a cabo una accion en componentes (por ejemplo botones) o sea no podría usarlo para hacer click en la bola( o imagen, o lo que sea que esté dibujado y no sea un componente como un botón) y que esta pudiera "responder" a ese click(por ejemplo al hacer click en la bola, esta cambia de color).¿Qué tipo de eventos puedo usar para esto?Supongo que hacer "click" sobre un dibujo o imagen en movimiento no será muy complicado, pero no se como hacerlo.
El código es:
Espero que se pueda entender el codigo!![Lengua :P](https://aprenderaprogramar.com/foros/Smileys/default/tongue.gif)
Muchisimas Gracias por todo y saludos!!
.... PERO mi duda es como lo puedo hacer mediante la clase Thread. En este ejercicio uso basicamente la clase Timer para el movimiento de la pelota y las clases keyReleased y keyPressed para poder cambiar la direccion de la pelota por teclado. Pero mi intensión es hacerlo con Thread en lugar de con Timer y mantener keyReleased y keyPressed para poder dirigir la direccion de la bola.
Además tengo otra duda, tengo entendido que(sobre eventos) la clase ActionListener solo sirve para llevar a cabo una accion en componentes (por ejemplo botones) o sea no podría usarlo para hacer click en la bola( o imagen, o lo que sea que esté dibujado y no sea un componente como un botón) y que esta pudiera "responder" a ese click(por ejemplo al hacer click en la bola, esta cambia de color).¿Qué tipo de eventos puedo usar para esto?Supongo que hacer "click" sobre un dibujo o imagen en movimiento no será muy complicado, pero no se como hacerlo.
El código es:
Código: [Seleccionar]
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.*;
public class Bola1 extends JFrame{
Panell panel=new Panell();
public Bola1(){
super("Bola Movimientoo");
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(panel);
setVisible(true);
}
public static void main(String[]args){
Bola1 bolita=new Bola1();
}
}
class Panell extends JPanel implements ActionListener{
BolaMovimientos bolaMov=new BolaMovimientos(this);
Timer timer;
public Panell(){
setFocusable(true);
addKeyListener(new teclado());
timer=new Timer(15,this);
timer.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D)g;
g2.setColor(Color.red);
g2.fillOval(bolaMov.getX(), bolaMov.getY(), 30, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
bolaMov.mover();
repaint();
}
private class teclado extends KeyAdapter{
public void keyReleased(KeyEvent e){
bolaMov.keyReleased(e);
}
public void keyPressed(KeyEvent e){
bolaMov.keyPressed(e);
}
}
}
class BolaMovimientos{
Panell panel1;
int x=1;
int y=1;
int dx=0;
int dy=0;
public BolaMovimientos(Panell panelito){
this.panel1=panelito;
}
public void mover(){
x=x+dx;
y=y+dy;
if((x+dx)>panel1.getWidth()-30){
dx=-1;
}else if((x+dx)<0){
dx=1;
}else if((y+dy)>panel1.getHeight()-30){
dy=-1;
}else if((y+dy)<0){
dy=1;
}
}
public void keyPressed(KeyEvent e){
int key=e.getExtendedKeyCode();
if(key==KeyEvent.VK_LEFT){
dx=-1;
dy=0;
}
if(key==KeyEvent.VK_RIGHT){
dx=1;
dy=0;
}
if(key==KeyEvent.VK_UP){
dx=0;
dy=-1;
}
if(key==KeyEvent.VK_DOWN){
dx=0;
dy=1;
}
}
public void keyReleased(KeyEvent e){
int key=e.getExtendedKeyCode();
if(key==KeyEvent.VK_LEFT){
}
if(key==KeyEvent.VK_RIGHT){
}
if(key==KeyEvent.VK_UP){
}
if(key==KeyEvent.VK_DOWN){
}
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
Espero que se pueda entender el codigo!
![Lengua :P](https://aprenderaprogramar.com/foros/Smileys/default/tongue.gif)
Muchisimas Gracias por todo y saludos!!