2014-09-07 3 views
0

Je suis en train de tester certaines choses avec j3d et je ne peux pas sembler obtenir un keylistener à travailler pour un BasicConstruct. Il ne fait rien quand j'appuie sur ay de la touche 38 (haut), pas même la sortie de débogage à la console. Voici une partie de ma classe principale "BasicConstruct". ici est où il devrait enregistrerons:Java keyListener ne fonctionne pas sur BasicConstruct

@SuppressWarnings("deprecation") //for the bc.show(true); 
public static void main(String[] argv) { 
    bc = new BasicConstruct(); 

    bc.setTitle("3D Rendering"); 

    bc.setSize(500, 500); 
    bc.setLocationRelativeTo(null); 
    bc.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    bc.refresh(addBox(0f, 0f, 0f, 0.005f, 0.5f, 0.5f, 
     new Color3f(1, 0, 0), new Color3f(1, 0, 0))); //draws a box on screen. not relevant to the queston 

    bc.setFocusable(true); 
    bc.addKeyListener(new PopClickListener()); 

    bc.addDirectionalLight(new Vector3f(0f, 0f, -1f), new Color3f(1f, 1f, 0f)); 
    bc.finalise(rootBranchGroup); 
    bc.show(true); 
} 

et la classe PopClickListener (havent pris la peine de le renommer):

import java.applet.Applet; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Random; 
import javax.vecmath.Color3f; 
public class PopClickListener extends Applet implements KeyListener { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == 38){ 
      BasicConstruct.placeblockonscreen(BasicConstruct.bc, randInt(.1f, 0f), 
       randInt(1f, 0f), randInt(.1f, 0f), randInt(.1f, 0f), randInt(.1f, 0f), 
       randInt(.1f, 0f), new Color3f(10, 10, 10), new Color3f(10, 10, 10)); 
       System.out.println("hey"); //debug 
     } 
    } 
    public void keyReleased(KeyEvent e) {} 
    public void keyTyped(KeyEvent e) {} 

    public static float randInt(float min, float max) { 

     Random rand = new Random(); 

     float finalfloat = rand.nextFloat() * (max - min) + min; 

     return finalfloat; 
    } 
} 

Répondre

1

Eh bien d'abord, assurez-vous que le keyPressed() devient appelé en plaçant un System.out.println("KEY PRESSED"); en dehors de l'instruction if, mais toujours dans la méthode. Si cela fonctionne, modifiez le code afin qu'il affiche le caractère clé, le code clé et d'autres choses sur KeyEvent. Cela vous dira quelle touche est pressée. Enfin, je suggère d'utiliser KeyEvent.VK_UP au lieu de l'entier 38 pour assurer les résultats attendus.

+0

J'ai changé de 39 à KeyEvent.VK_UP et cela a fonctionné ... jusqu'à ce que vous le déplaciez. puis il arrête d'écouter l'événement clé –

+0

l'a finalement obtenu. J'avais besoin d'ajouter l'écouteur clé au canevas au lieu du basicconstruct. Avant, je pensais que vous ne pouviez pas ajouter des listes sur la toile: P merci pour votre aide tenny! –