1

ユーザーのキー入力に従って、四角形を上、下、左、右に移動しようとしています。私のKeyHandlerは正常に動作し、形状を上または下に移動しますが、X軸(左または右)に従って移動しません。

これが私のKeyHandler(KeyPressed)のコードです。

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

    if(keyCode == KeyEvent.VK_UP){
        System.out.println("You have pressed: " +keyCode);
        _screen.player[0].y -= 3;
        _screen.repaint();

    }else if(keyCode == KeyEvent.VK_DOWN){
        System.out.println("You have pressed: " +keyCode);
        _screen.player[0].y += 3;
        _screen.repaint();

    }else if(keyCode == KeyEvent.VK_LEFT){
        System.out.println("You have pressed: " +keyCode);
        _screen.player[0].x -= 3;
        _screen.repaint();

    }else if(keyCode == KeyEvent.VK_RIGHT){
        System.out.println("You have pressed: " +keyCode);
        _screen.player[0].x += 3;
        _screen.repaint();

    }else if(keyCode == KeyEvent.VK_ESCAPE){
        System.exit(0);

    }

}

X 軸上で長方形を移動するために何か別のことをしなければなりませんか?

4

1 に答える 1

2

投稿されたコードに明らかなエラーはありません。問題は、表示されていないコードの部分にある可能性があります。実行可能な例 (つまりSSCCE )を投稿することは常に良い考えです。

キーリスナーを使用する場合は、コンポーネントがフォーカス可能であり、フォーカスがあることを確認してください。ただし、キー リスナーは低レベルのインターフェイスであるため、使用することはお勧めしません。代わりにキー バインドを使用することをお勧めします。詳細と例については、キーバインディングの使用方法を参照してください。Swingアクションも参照してください。

以下は、パネル内で四角形を移動するためのキー バインドとアクションを示す簡単な例です。

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();
            }
        });
    }
}
于 2013-03-30T16:21:01.800 に答える