elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Recibir teclado java
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recibir teclado java  (Leído 5,803 veces)
Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Recibir teclado java
« en: 17 Noviembre 2013, 23:04 pm »

Hola estoy tratando de capturar una tecla presionada y ejecutar una acción.

Este es el código:

Código:
public void keyPressed(KeyEvent e) {
                    tecla = e.getKeyCode();
                    switch(tecla){
                      case 1:  System.out.println("Hola"); 
                      break;
                    }

Quiero guardar la tecla 1 en la variable tecla, usarla como opción para switch y ejecutar el case 1. Pero no sucede nada. No imprime.


En línea

Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Recibir teclado java
« Respuesta #1 en: 17 Noviembre 2013, 23:09 pm »

No, ya lo hice. El problema era que al presionar 1, el getKeyCode recibe un 49, así que un if, y está solucionado.


En línea

Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Recibir teclado java
« Respuesta #2 en: 17 Noviembre 2013, 23:15 pm »

Lo que me gustaría es que al determinar que tecla es 1 y ejecutar la opción 1 del switch, entonces hacer que en el frame se dibuje un circulo. Pero no he podido invocar el método paint dentro del keypressed.
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Recibir teclado java
« Respuesta #3 en: 17 Noviembre 2013, 23:28 pm »

De acuerdo al número de la tecla que devuelva getKeyCode() (ver codigo ASCII) haces un switch y evalúas los posibles resultados. Otra opción es usar el método getKeyChar() que devuelve un char que contiene la letra.

Luego, puedes crear varios metodos para dibujar la figura deseada, aquí haces uso de Graphics (Si no lo conoces bien, ver la doc). Luego, los llamas desde el switch.

Mi idea es así:
Código
  1. char letra = evt.getKeyChar();
  2.  
  3. switch (letra) {
  4.  
  5.    case 'a': dibujarCuadrado(); break;
  6.    case 'b': dibujarCicurclo(); break;
  7.    case 'c': dibujarPoligono(); break;
  8. }
  9.  
« Última modificación: 17 Noviembre 2013, 23:36 pm por M1t$u » En línea

Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Recibir teclado java
« Respuesta #4 en: 18 Noviembre 2013, 01:34 am »

Estoy tratando de hacer que se mueva una pelota en un frame, pero quiero que se comience a mover después de presionar la tecla 1 que está dentro del case.

Esta clase es para poder llamar el método que mueve la pelota, pero el problema es que se ejecuta desde el main en la clase principal, y no puedo sacar el main de esa clase.
Código:
public class Funciones extends JPanel{
    
    public Funciones() {
    KeyListener listener = new MyKeyListener();
addKeyListener(listener);
setFocusable(true);
    
}

  
    public class MyKeyListener implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
}


        @Override
public void keyPressed(KeyEvent e) {
            int tecla = e.getKeyCode();
                    if(tecla==49)
                    {
                        tecla = 1;
                    }
                    
                    switch(tecla){
                      case 1:
                    }
                    
}

        @Override
        public void keyReleased(KeyEvent e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    }
}


Esta es la clase principal y la que permite que se ejecute automáticamente la ventana sin dejar que presione un botón para poder ejecutar esa ventana:

Código:
public class Principal2 extends JFrame implements Runnable{
 

 public void paint (Graphics g)
    {
        super.paint(g);
        g.setColor (Color.black);
        
        g.fillOval (PosX-radioPelota, PosY-radioPelota, radioPelota*2, radioPelota*2);
      
    }
    
    int PosX=60,PosY=184; //Posición de la pelota

int DirX=PosX % 10 +5; //Dirección de la pelota
int DirY=PosY % 10 +1; //Dirección de la pelota
int radioPelota=35; //Radio de la pelota
Thread hilo;

public void start()
{
if(hilo== null)
{
hilo= new Thread(this);
hilo.start();
}
}

public void run()
{
while(true)
{
mover(); //Función que mueve la pelota
repaint();

try { Thread.sleep(10);
} catch (InterruptedException exc) { }

}
}


public void mover()
{
PosX+=DirX;
PosY+=DirY;

//Controlo que cuando toca el borde, cambie de direccion
if ((PosX-radioPelota) <= 0)
DirX*= -1;
else if ((PosX+radioPelota) >= getWidth())
DirX*= -1;

if ((PosY-radioPelota) <= 0)
    
DirY*= -1;
else if ((PosY+radioPelota) >= getHeight())
DirY*= -1;
}  
    public static void main(String[] args) {
        Principal2 p = new Principal2();
      
        p.setSize(640, 480);
p.setVisible(true);
               p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      p.start();
    }
}

« Última modificación: 18 Noviembre 2013, 01:39 am por Lain0x » En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Recibir teclado java
« Respuesta #5 en: 18 Noviembre 2013, 01:43 am »

¿Disculpa pero cuál es tu duda? Sé más específico por favor, si te salta una excepción, o no funciona como debería, o qué se yo, pero especifica con detalle el problema para poder comprenderte.
En línea

Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Recibir teclado java
« Respuesta #6 en: 18 Noviembre 2013, 01:57 am »

Lo que quiero es que al ejecutar se abra una ventana con la pelota quieta, al presionar uno se mueva, osea se ejecute el metodo start().

En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Recibir teclado java
« Respuesta #7 en: 18 Noviembre 2013, 02:30 am »

No lo he probado (no tengo una pc a mano), pero algo así debería funcionar.


UPDATE:


Panel que dibujará:

Código
  1.        public class PanelGrafico extends JPanel {
  2.  
  3.            int PosX = 60,PosY=184; //Posici&#243;n de la pelota
  4.            int DirX = 0; //Direcci&#243;n de la pelota
  5.            int DirY = 0; //Direcci&#243;n de la pelota
  6.            int radioPelota = 3.5; //Radio de la pelota
  7.  
  8.            Eventos driverEventos = new Eventos(this);
  9.  
  10.    public PanelGrafico()
  11.    {
  12.              this.setBackground(Color.WHITE);
  13.              this.setFocusable(true);
  14.              this.addKeyListener(driverEventos);
  15.    }
  16.  
  17.            @Override
  18.            public void paintComponent(Graphics g){
  19.                super.paintComponent(g);
  20.                Graphics2D graphics = (Graphics2D) (g);
  21.                //establece antialiasing (bordes finos)
  22.                graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  23.                RenderingHints.VALUE_ANTIALIAS_ON);
  24.                g.setColor(Color.black);
  25.                g.fillOval (PosX-radioPelota, PosY-radioPelota, radioPelota*2, radioPelota*2);
  26.                g.dispose();
  27.            }
  28.  
  29.            public void mover()
  30.           {
  31.             PosX+= DirX;
  32.             PosY+= DirY;
  33.  
  34.             //Controlo que cuando toca el borde, cambie de direccion
  35.             if ((panel.PosX-radioPelota) <= 0)
  36.             DirX*= -1;
  37.             else if ((PosX+radioPelota) >= getWidth())
  38.             DirX*= -1;
  39.  
  40.             if ((PosY-radioPelota) <= 0)  
  41.             DirY*= -1;
  42.             else if ((PosY+panel.radioPelota) >= getHeight())
  43.             DirY*= -1;
  44.            }  
  45.  
  46.        }
  47.  

Frame:

Código
  1. public Figura extends JFrame {
  2.  
  3.      PanelGrafico panel = null;
  4.  
  5.      public Figura() {
  6.  
  7.         try{
  8.                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName() );
  9.            }
  10.                JOptionPane.showMessageDialog(null,e.toString());
  11.            }
  12.  
  13.           this.panel = new PanelGrafico();
  14.           this.add(panel);
  15.           this.setSize(550,550);
  16.           this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  17.           this.setVisible(true);
  18.      }
  19.  

Controladora de eventos:

Código
  1. import java.awt.event.KeyEvent;
  2. import java.awt.event.KeyListener;
  3.  
  4.  
  5. public class Eventos implements KeyListener,Runnable {
  6.  
  7.    // Creo un objeto Panel para despues poder acceder a los
  8.    // componentes del Frame mediante un objeto de esa clase
  9.    PanelGrafico ref;
  10. public Eventos(Panel referencia)
  11. {
  12. ref = referencia;
  13.    }
  14.  
  15.    @Override
  16.    public void keyPressed(KeyEvent evento)
  17.    {
  18.        char letra = evt.getKeyChar();
  19.  
  20.        switch (letra) {
  21.              case 'a': run(); break;
  22.        }
  23.    }
  24.  
  25.    @Override
  26.    public void keyReleased(KeyEvent e)
  27.    {
  28.        // nada
  29.    }
  30.  
  31.    @Override
  32.    public void keyTyped(KeyEvent e)
  33.    {
  34.        // nada
  35.    }
  36.  
  37.    @Override
  38.    public void run()
  39.    {
  40.          while(true)
  41.           {
  42.              ref.mover(); //Funci&#243;n que mueve la pelota
  43.              ref.repaint();
  44.  
  45.             Thread.sleep(10);
  46.           }
  47.   }
  48.  
  49. }
  50.  

Main:

Código
  1. import javax.swing.SwingUtilities;
  2.  
  3.  
  4. public class Main {
  5.  
  6.    public static void main(String... main)
  7. {
  8. SwingUtilities.invokeLater(new Runnable(){
  9. @Override
  10. public void run()
  11. {
  12.                            new Figura();
  13. }
  14. });
  15. }
  16. }
  17.  


Creo que ya no me falta corregir nada más a simple vista. Última actualización 20:43 GMT -5.

Espero te sirva, saludos..
« Última modificación: 18 Noviembre 2013, 02:46 am por M1t$u » En línea

Lain0x

Desconectado Desconectado

Mensajes: 72


Ver Perfil
Re: Recibir teclado java
« Respuesta #8 en: 18 Noviembre 2013, 03:33 am »

Lo probé pero al momento de presonar la tecla "a", la pelota no hace nada y ya no se puede cerrar la ventana. Claro, arreglando los errores de tipeo y todo eso.
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Recibir teclado java
« Respuesta #9 en: 19 Noviembre 2013, 19:48 pm »

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:

Código
  1. import javax.swing.JFrame;
  2. import javax.swing.JPanel;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6.  
  7. public class KeyListenerGraphicsDemo extends JFrame {
  8.  
  9.    public KeyListenerGraphicsDemo() {
  10.        init();
  11.    }
  12.  
  13.    private void init() {
  14.        this.setTitle("Demo Graphics and KeyListener");
  15.        this.setVisible(true);
  16.        this.setSize(400,300);
  17.        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  18.        this.add(new PanelGrafico());
  19.    }
  20.  
  21. public class PanelGrafico extends JPanel {
  22.  
  23.    private float radio = 35f;
  24.    private int ancho = 60, alto = 180;
  25.    private int dirX = ancho % 10 +5;
  26.    private int dirY = alto % 10 +1;
  27.  
  28.    DriverEvents driver = new DriverEvents(this);
  29.  
  30.    public PanelGrafico() {
  31.        // hace el panel focusable para que pueda implementar
  32.        // KeyListener, ya que por defecto no es focusable
  33.        this.setFocusable(true);
  34.        this.addKeyListener(driver); // asocia el panel con el driver
  35.    }
  36.  
  37.    @Override
  38.    public void paintComponent(Graphics g) {
  39.        super.paintComponent(g);
  40.        Graphics2D g2 = (Graphics2D) g;
  41.  
  42.        // utiliza el metodo mover la dibujar
  43.        g2.setColor(Color.BLUE);
  44.        g2.fillOval((int)(ancho - radio),(int)(alto - radio), (int)(radio*2),(int) (radio*2));
  45.    }
  46.  
  47.    // mueve la pelota a lo largo del marco
  48.    public void mover() {
  49.  
  50.        ancho += dirX;
  51.        alto += dirY;
  52.  
  53.        //Controlo que cuando toca el borde, cambie de direccion
  54.        if ((ancho-radio) <= 0)
  55.            dirX*= -1;
  56.        else if ((ancho+radio) >= getWidth())
  57.            dirX*= -1;
  58.  
  59.        if ((alto-radio) <= 0)
  60.            dirY*= -1;
  61.        else if ((alto+radio) >= getHeight())
  62.            dirY*= -1;
  63.        this.repaint();
  64.    }  
  65.  
  66.  
  67. }
  68.  
  69. }
  70.  

Driver de los eventos del JPanel:

Código
  1. import java.awt.event.KeyEvent;
  2. import java.awt.event.KeyListener;
  3. import source.KeyListenerGraphicsDemo.PanelGrafico;
  4.  
  5.  
  6. public class DriverEvents implements KeyListener {
  7.  
  8.    private final PanelGrafico panel; // maneja el panel
  9.    private byte cantidadThreads = 0; // cantidad de threads
  10.    private boolean correr = true; // condicion del thread
  11.  
  12.    public DriverEvents(PanelGrafico panel) {
  13.        this.panel = panel;
  14.    }
  15.  
  16.    // recupera el caracter de la letra y ejecuta el thread
  17.    // en caso se presione la letra correcta
  18.    @Override
  19.    public void keyPressed(KeyEvent e) {
  20.        char letterPress = e.getKeyChar();
  21.  
  22.        switch(letterPress) {
  23.            case 'M':
  24.            case 'm': correr = true; start(); break;
  25.            case 'S':
  26.            case 's': correr = false; cantidadThreads = 0; break;
  27.        }
  28.    }
  29.  
  30.    // si no hay threads en ejecucion, crea uno nuevo y lo ejecuta
  31.    private void start() {
  32.        cantidadThreads++;
  33.        if (cantidadThreads <= 1) {
  34.            PaintThread thread = new PaintThread();
  35.            thread.start();
  36.        }
  37.    }
  38.  
  39.    @Override
  40.    public void keyTyped(KeyEvent e) {
  41.    }
  42.  
  43.  
  44.    @Override
  45.    public void keyReleased(KeyEvent e) {
  46.    }
  47.  
  48. // Thread
  49. public class PaintThread extends Thread {
  50.  
  51.    @Override
  52.    public void run() {
  53.        while(correr == true) {
  54.            panel.mover();
  55.            panel.repaint();
  56.  
  57.        }
  58.    }
  59. }
  60.  
  61. }
  62.  

Main:

Código
  1. import javax.swing.SwingUtilities;
  2.  
  3.  
  4. public class Main {
  5.    public static void main(String... args) {
  6.    SwingUtilities.invokeLater(new Runnable() {
  7.        @Override
  8.        public void run(){
  9.            new KeyListenerGraphicsDemo();
  10.    }
  11.    });
  12.    }
  13. }
  14.  



Como ves no es nada difícil. Espero te haya servido.



Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Convertir de teclado portatil a teclado xa pc
Electrónica
qtpirex 1 3,270 Último mensaje 13 Marzo 2007, 18:09 pm
por loredo
Como bloquear teclado y raton en java?
Java
INFORMATICO95 3 7,806 Último mensaje 17 Abril 2008, 22:19 pm
por Casidiablo
Problemas con el teclado en portatil y teclado inalambrico
Hardware
any_t 2 4,088 Último mensaje 2 Septiembre 2012, 16:08 pm
por simorg
Recibir un string del teclado de forma "segura"
Programación C/C++
NathanD 2 2,231 Último mensaje 4 Diciembre 2012, 16:13 pm
por rir3760
Programacion de evento con el teclado en Java
Java
F.F 1 2,025 Último mensaje 6 Diciembre 2014, 14:22 pm
por MNicolas
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines