2013-05-05 2 views
1

약 5 시간 동안이 문제를 해결하려고했지만 KeyListener가 전혀 반응하지 않는 이유를 알 수 없습니다. 그것은 심지어 keyInput을 찾는 지점에 도달하는 것처럼 보이지 않습니다? 이것은가 호출되는 클래스입니다 :KeyListener가 전혀 반응하지 않음

package summonit; 

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.io.IOException; 

public class Player extends KleinerScreen implements KeyListener { 

    public Player() throws IOException{ 
     addKeyListener(this); 
    } 
    public static int playerX=20; 
    public static int playerY; 

    @Override 
    public void keyTyped(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_K) { 
      playerX += 100; 
     } 
     System.out.println(playerX); 
     repaint(); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_K) { 
      playerX += 100; 
     } 
     System.out.println(playerX); 
     repaint(); 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

}

그리고 메인 클래스 :

package summonit; 
import java.awt.*; 
import java.io.IOException; 
import javax.swing.JFrame; 

public class Summonit extends JFrame{ 

    public static void main(String[] args) throws IOException { 

     Summonit game = new Summonit(); 
     Screen window = new Screen(); 
     TileMap tilemap = new TileMap(); 
     Player player = new Player(); 

    } 
} 

패널 클래스

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package summonit; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 

/** 
* 
* @author Boyen 
*/ 
public class KleinerScreen extends JPanel { 

    String i = "457528_3569247037775_1427420686_o.jpg"; 
    String s = "City.txt"; 
    public static Dimension windowsize = new Dimension(1000, 1000); 
    private int mapWidth; 
    private int mapHeight; 
    public int map[][]; 
    final int playerRows = 4; 
    final int playerCols = 4; 
    //images of tiles 
    private Image tileYellowPath; 
    private Image tileGround; 
    BufferedImage bigPlayerImg; 
    BufferedImage[] sprites; 
    //images 

    public KleinerScreen() throws IOException { 
     setPreferredSize(windowsize); 

     tileYellowPath = new ImageIcon(getClass().getResource("/CorrodedTechnoTiles.png")).getImage(); 
     tileGround = new ImageIcon(getClass().getResource("/images.jpg")).getImage(); 
     bigPlayerImg = ImageIO.read(new File("res/sprites_player_3.png")); 
     sprites = new BufferedImage[playerRows * playerCols]; 
     for (int i = 0; i < playerRows; i++) { 
      for (int j = 0; j < playerCols; j++) { 
       sprites[(i * playerCols) + j] = bigPlayerImg.getSubimage(
         j * 150, 
         i * 150, 
         150, 
         150); 
      } 
     } 

    } 

    public void readTiles() { 
    } 

    public void paint(Graphics g) { 
     for (int i = 0; i < TileMap.map.length; i++) { 
      for (int j = 0; j < TileMap.map[i].length; j++) { 

       switch (TileMap.map[i][j]) { 
        case 0: 
         g.drawImage(tileGround, windowsize.width/10 * j, windowsize.height/10 * i, windowsize.height/10, windowsize.width/10, null); 
         break; 
        case 1: 
         g.drawImage(tileYellowPath, windowsize.width/10 * j, windowsize.height/10 * i, windowsize.height/10, windowsize.width/10, null); 
         break; 

       } 
      } 
     } 
     g.drawImage(sprites[5], Player.playerX, 0 ,100,100,null); 
    } 
} 
+1

포럼을 검색 했습니까? "내 핵심 청취자는 왜 작동하지 않는가?"라는 질문이 많습니다. 모두 동일한 대답을 가지고 있습니다. – camickr

답변

4

사용 Key Bindings. 다음은이를 사용하는 간단한 예제입니다.

public class Test 
{ 
    JFrame frame = new JFrame(); 

    public Test() 
    { 
     ActionMap actionMap = frame.getRootPane().getActionMap(); 
     InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 

     for (Keys direction : Keys.values()) 
     { 
      actionMap.put(direction.getText(), new KeyBinding(direction.getText())); 
      inputMap.put(direction.getKeyStroke(), direction.getText()); 
     } 
     frame.getRootPane().setActionMap(actionMap); 
     frame.getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); 
     frame.setVisible(true); 
    } 

    private class KeyBinding extends AbstractAction 
    { 

     private static final long serialVersionUID = 1L; 

     public KeyBinding(String text) 
     { 
      super(text); 
      putValue(ACTION_COMMAND_KEY, text); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      String action = e.getActionCommand(); 
      System.out.println("Key Binding: " + action); 
     } 
    } 

    public static void main(String... args) 
    { 
     new Test(); 
    } 
} 

enum Keys 
{ 
    ESCAPE("Escape", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), 
    CTRLC("Control-C", KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK)), 
    CTRLP("Control-P", KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK)), 
    UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)), 
    DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)), 
    LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)), 
    RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); 

    private String text; 
    private KeyStroke keyStroke; 

    Keys(String text, KeyStroke keyStroke) 
    { 
     this.text = text; 
     this.keyStroke = keyStroke; 
    } 

    public String getText() 
    { 
     return text; 
    } 

    public KeyStroke getKeyStroke() 
    { 
     return keyStroke; 
    } 

    @Override 
    public String toString() 
    { 
     return text; 
    } 
} 
+0

빠른 답변을 주셔서 감사합니다. 아직 모든 코드를 이해하지 못하고 프로젝트에 적용하는 방법도 있지만 최선을 다해 보겠습니다. 감사합니다. – Boyen

+0

@Boyen 확실한 것. 당신이 그것을 이해하지 않으면, 내 대답에 완전히 링크 된 튜토리얼을 읽어보십시오. 그 후에도 Key Bindings에 관한 질문이 있으시면, 다른 질문을하십시오. – syb0rg

+0

하지만 KeyListener와 함께 작동하지 않는 이유는 무엇입니까? – Boyen

0

수신기가있는 구성 요소에 포커스가 없으면 키리스터는 작동하지 않습니다. 귀하의 코드를 보면 JFrame에 실제로 Player 인스턴스를 추가하지 않으므로 포커스를 가질 수없는 것으로 보입니다.

난 당신이 JFrame의에 추가하고 사용하여 프레임을 표시하는 것이 좋습니다 것 그들이에 등록 된 구성 요소가 포커스이며 포커스가있는 경우에만 반응합니다 트릭

+0

혼란 스럽습니다. 패널 클래스로 코드를 업데이트하겠습니다. – Boyen

1

KeyListeners을해야 this.setVisible(true); . 대부분의 Swing 최상위 컨테이너는 키보드 포커스를 직접받을 가능성이 전혀 없습니다. 콘텐트 패널 (다른 것들 중에서)의 ontop (키보드 포커스를받을 수 없었던 것)이있는 JRootPane을 가지고 있으므로, 다른 구성 요소가 추가되었습니다.

이것은 KeyListeners의 일반적인 알려진 문제이며 대신 Key Bindings을 권장합니다.

측면에는 사용자 정의 그림이 걱정됩니다. 페인트를 무효화하고 paintComponent을 대신 사용해야합니다. Graphics 컨텍스트가 페인팅을 위해 올바르게 준비되었는지 확인하려면 super.paintXxx을 호출해야합니까?

자세한 내용은 Performing Custom Painting을 참조하십시오.

관련 문제