게시 된 코드에 명백한 오류가 없습니다. 이 문제는 코드 부분에 표시되지 않을 수 있습니다. 실행 가능한 예제 (예 : SSCCE)를 게시하는 것이 좋습니다.
키 수신기를 사용하는 경우 구성 요소에 포커스가 있고 포커스가 있는지 확인하십시오. 그러나 하위 수준 인터페이스이므로 키 수신기를 사용하지 않는 것이 좋습니다. 키 바인딩을 대신 사용하는 것이 좋습니다. 자세한 내용 및 예는 How to Use Key Bindings을 참조하십시오. 또한 스윙 actions을 살펴보십시오.
다음은 패널 주위에 사각형을 이동하는 키 바인딩과 행동을 보여주는 간단한 예는 다음과 같습니다
public class MoveRectangle extends JPanel {
private Point rectPosition = new Point();
public static final int RECT_SIZE = 50;
public Point getRectPosition() {
return rectPosition;
}
public void setRectPosition(Point position) {
this.rectPosition = position;
repaint();
}
public MoveRectangle() {
InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up");
actionMap.put("up", new MoveAction(this, MoveAction.Direction.UP));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down");
actionMap.put("down", new MoveAction(this, MoveAction.Direction.DOWN));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "left");
actionMap.put("left", new MoveAction(this, MoveAction.Direction.LEFT));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right");
actionMap.put("right", new MoveAction(this, MoveAction.Direction.RIGHT));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(rectPosition.x, rectPosition.y, RECT_SIZE, RECT_SIZE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
static class MoveAction extends AbstractAction {
public enum Direction{
LEFT, RIGHT, UP, DOWN
};
private Direction direction;
private MoveRectangle panel;
public MoveAction(MoveRectangle panel, Direction direction) {
this.direction = direction;
this.panel = panel;
}
@Override
public void actionPerformed(ActionEvent e) {
Point position = panel.getRectPosition();
switch(direction) {
case LEFT:
position.x -= 3;
break;
case RIGHT:
position.x += 3;
break;
case UP:
position.y -= 3;
break;
case DOWN:
position.y += 3;
break;
}
panel.setRectPosition(position);
}
}
private static void createAndShowUI() {
JFrame frame = new JFrame("Move Rectangle");
frame.getContentPane().add(new MoveRectangle());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
당신은 문제의보다 완전한 예를 게시 할 수 있습니까? –