2016-04-10 17 views
-1

Bir uygulamayı (burada dikdörtgendir) uygulamada taşımak istiyorum, uygulamacı çizer, ancak resmin neden hareket etmediğini merak ediyorum. derleme hatası yok! Benim yukarı/aşağı/sol/yazma okunu basılıResim, uygulamada hareket etmiyor

package game; 

import java.awt.*; 
import javax.swing.*; 
import java.applet.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 



public class Gamer extends JApplet implements KeyListener 
{ 
    private int x=50,y=50; 


@Override 
public void init() 
{ 
    addKeyListener(this); 
} 

@Override 
public void keyPressed(KeyEvent e) 
{ 
    int keyCode = e.getKeyCode(); 

    switch(keyCode) 
    { 
    case KeyEvent.VK_UP: 
     if(y>0) //when up key is pressed and the position of the player is not on the edge 
     { 
      y=y-19; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_DOWN: 
     if(y<171) //when down key is pressed and the position of the player is not on the edge 
     { 
      y=y+19; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_LEFT: 
     if(x>0) 
     { 
      x=x-15; 
      repaint(); 
     } 
     break; 
    case KeyEvent.VK_RIGHT: 
     if(x<285) 
     { 
      x=x+15; 
      repaint(); 
     } 
     break; 
    } 
} 
@Override 
public void paint(Graphics g) //will draw the background and the character 
{ 
    g.fillRect(x, y, 200, 200); 

} 

@Override 
public void keyReleased(KeyEvent arg0) 
{ 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) 
{ 
    // TODO Auto-generated method stub 

} 
} 

, dikdörtgen hareket etmiyor:

burada benim kodudur. Lütfen nedenini açıklayın? T.I.A.

+0

1) Neden bir uygulamacığı kodlayın? Bunu belirten öğretmene bağlıysa, lütfen bunları [Neden CS öğreticilerinin ** Java uygulamalarını öğretmeyi ** durdurması gerektiğini] belirtin (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop öğretim-java uygulamaları /). 2) [Java Plugin desteğini kullanımdan kaldırılmış] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) ve [Plugin-Free Web'e Geçme] 'ye bakın. https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). 3) Swing için, genellikle 'KeyListener' yerine [key bindings] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) kullanırız. –

cevap

1

Sorun boya yöntemi denir almaz böylece uygulaması, KeyEvent yakalamak olmamasıdır.

KeyListener'u JApplet'a eklemek istediğinizde bir sorun var ve çalışmıyor.

Çözüm KeyEventDispatcher yerine KeyListener uygulamaktır. Bu yararlı olacaktır

package game; 

import java.awt.Graphics; 
import java.awt.KeyEventDispatcher; 
import java.awt.KeyboardFocusManager; 
import java.awt.event.KeyEvent; 

import javax.swing.JApplet; 

public class Gamer extends JApplet implements KeyEventDispatcher { 
    private int x = 50, y = 50; 

    @Override 
    public void init() { 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); 
    } 

    @Override 
    public void paint(Graphics g) // will draw the background and the character 
    { 
     super.paint(g); // <- added to your code to clear the background 
         //   before re-painting the new square 

     g.fillRect(x, y, 20, 20); 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 

     switch(keyCode) 
     { 
     case KeyEvent.VK_UP: 
      if(y>0) //when up key is pressed and the position of the player is not on the edge 
      { 
       y=y-19; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_DOWN: 
      if(y<171) //when down key is pressed and the position of the player is not on the edge 
      { 
       y=y+19; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_LEFT: 
      if(x>0) 
      { 
       x=x-15; 
       repaint(); 
      } 
      break; 
     case KeyEvent.VK_RIGHT: 
      if(x<285) 
      { 
       x=x+15; 
       repaint(); 
      } 
      break; 
     } 
     return false; 
    } 

} 

Hope: Ayrıca ben daha iyi dikdörtgenin hareketlerini görmek mümkün amacıyla 20 200 adresinin dikdörtgenin boyutunu değiştirdi.

+0

Çalışır, çok teşekkürler – 000

+0

Hoş Geldiniz. Hayır, 'KeyEventDispatcher'ı' init() 'yönteminde kaydetmek zorunlu değildir. Bu bir uygulama olduğu için, 'init' içindeki tüm bileşenleri başlatıyoruz ve örneğinizde 'KeyEventDispatcher 'kaydını yapmak için uygun başka bir yöntem yoktu. Bu örnekte her nasılsa, zorunludur ;-) – STaefi