2010-09-15 5 views
0

J'ai donc travaillé sur un programme simple tout en apprenant Java qui fait apparaître un petit écran rectangulaire sur lequel circule un cercle. L'arrière-plan et le cercle changent également de couleur et de vitesse.Key Events in Java - Aide débutant

Maintenant, j'essaie d'ajouter KeyEvents, de sorte que lorsque l'utilisateur tape un caractère, le cercle changera de direction. J'ai essayé de maîtriser la fonctionnalité KeyEvent pendant quelques heures maintenant, et je suis bloqué.

Comment voulez-vous changer le code suivant pour que le programme répond à l'entrée du clavier:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Rectangle2D; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 
import javax.swing.JFrame; 

public class MovingCircle3 extends JFrame implements ActionListener { 

    Ellipse2D.Double myEllipse; 
    Rectangle2D.Double backgroundRectangle; 
    private int paintTally = 0;  // Counts # of repaints. 
    private int timerSpeed = 500; // Holds speed of timer. Initially: 500ms. 
    private Timer timerOjbect; 
    private char shapeMoveInput = 'd'; 

    public MovingCircle3() { 
     myEllipse = new Ellipse2D.Double(30, 30, 20, 20); // Ellipse starting point 
     backgroundRectangle = new Rectangle2D.Double(0, 0, 400, 300); // Background. 
     this.timerOjbect = new Timer(500, this); 
     timerOjbect.start();     //Creates and starts timer. 
    } 

    public static void main(String[] args) { 
     System.out.print("Game Controls: \n l = Move left. \n r = Move right. \n u = Move up. \n d = Move down. \n ENTER COMMAND: "); // Game controls. 

     MovingCircle3 b = new MovingCircle3(); 

     b.setVisible(true); 
     b.setSize(400, 300); 
     b.setVisible(true); 
     b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void keyPressed(KeyEvent e) { 
     try { 
      shapeMoveInput = e.getKeyChar(); 
     } catch (Exception ex) { 
      shapeMoveInput = 'd'; 
     } 
    } 

    public void actionPerformed(ActionEvent ae) { 
     //This will be called by the Timer 
     if (shapeMoveInput == 'l') { 
      myEllipse.setFrame(myEllipse.getX() - 1, myEllipse.getY(), myEllipse.getWidth(), myEllipse.getHeight()); //Move 1 x-pixel left 
     } else if (shapeMoveInput == 'r') { 
      myEllipse.setFrame(myEllipse.getX() + 1, myEllipse.getY(), myEllipse.getWidth(), myEllipse.getHeight()); //Move 1 x-pixel right 
     } else if (shapeMoveInput == 'u') { 
      myEllipse.setFrame(myEllipse.getX(), myEllipse.getY() - 1, myEllipse.getWidth(), myEllipse.getHeight()); //Move 1 y-pixel up 
     } else if (shapeMoveInput == 'd') { 
      myEllipse.setFrame(myEllipse.getX(), myEllipse.getY() + 1, myEllipse.getWidth(), myEllipse.getHeight()); //Move 1 y-pixel 
     } 
     repaint(); 
    } 

    public void paint(Graphics g) { 
     paintTally++; // Increments by one for every repaint(). 
     if (paintTally % 25 == 0) { // Take modulus 25 of paintTally to execute every 25 paints. 
      timerSpeed = (int) (timerSpeed/2); 
      timerOjbect.setDelay(timerSpeed); // Divide speed by 2 and see to timer length. 
     } 
     int isPaintTen = (int) (paintTally/10); // Divide current count by 10. 
     Graphics2D g2 = (Graphics2D) g; 
     if ((isPaintTen % 2) == 0) { // Take modulus to set if #/10 is odd or even. 
      g2.setColor(Color.YELLOW); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.RED); 
      g2.draw(myEllipse); 

     } else if ((isPaintTen % 2) == 1) { 
      g2.setColor(Color.RED); 
      g2.fill(backgroundRectangle); 
      g2.setColor(Color.YELLOW); 
      g2.draw(myEllipse); 
     } 
    } 
} 
+2

http://download.oracle.com/javase/tutorial/uiswing/examples/events/index.html#KeyEventDemo –

+0

Code reformaté; s'il vous plaît revenir si incorrect. – trashgod

+0

Il y a beaucoup de bonnes ressources Java sur le Web. Surtout quand vous commencez à faire vos premiers pas, googler ce que vous essayez de faire (dans ce cas, quelque chose comme "entrée clavier Java") donnera souvent un exemple de code bien expliqué. –

Répondre

1

Hé là, il semblerait que vous avez besoin d'un KeyListener mais ActionListener fonctionnera sur votre JFrame. Il semble que vous implémentiez le ActionListener qui est une super-classe de l'écouteur de touche. Vous l'implémentez correctement mais après que vous avez besoin d'enregistrer un nouveau programme d'écoute, le thread d'événement dans Swing envoie des événements à cet écouteur. Le thread d'événement est un thread géré par le système. Vous pouvez lire sur ce site Event Thread sur oracles/Suns. Aussi juste une note de côté, il utilise le motif Observateur si vous êtes intéressé.

Tout ce que vous devez faire est dans l'initialisation MovingCircle3() faire le

this.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) 
      { 
       movingcircle3_Function(e); 
      } 
     }); 

ou vous pouvez essayez ce qui suit mais après je ne suis pas sûr si cela fonctionnerait correctement

this.addActionListener(this);

1

Lire sur InputMap et ActionMap. (tutoriel here) Il s'agit d'un processus en deux étapes de mappage des traits du clavier à un ID, puis des ID à l'appel d'une méthode.

2

1) Vous ne devriez JAMAIS (sauf si vous savez vraiment ce que vous faites) remplacer la méthode de peinture d'un JFrame. La peinture personnalisée est effectuée en remplaçant la méthode paintComponent (...) d'un JPanel. Ensuite, vous ajoutez le panneau personnalisé au JFrame. Vous avez reçu un lien vers le tutoriel Swing dans les commentaires de votre publication originale. Lisez la section sur la peinture personnalisée pour plus d'informations et des exemples de travail.

2) Vous devrez ensuite ajouter le KeyListener au panneau. Toutefois, les KeyEvents sont uniquement transmis au composant avec focus, vous devez donc le rendre focalisable en utilisant la méthode setFocusable (...) sur le panneau. Toutefois, un KeyListener n'est pas le moyen approprié pour résoudre ce problème. Vous devriez utiliser des liaisons de touches qui sont beaucoup plus flexibles que l'utilisation de KeyListeners. Encore une fois, il y a une section dans le tutoriel Swing sur "Comment utiliser les liaisons de touches".