Ключевые события Java и управление таймером

Я почти закончил этот автомобильный проект, над которым работаю, но, похоже, не могу заставить ключевые события работать. Я думаю, что это связано с моим прослушивателем действий с моим таймером, но я не уверен. Когда я нажимаю клавишу со стрелкой вверх, задержка таймера должна уменьшаться, и наоборот для клавиши со стрелкой вниз. У меня написаны команды, но они не регистрируют ввод. Если бы кто-нибудь мог дать мне несколько советов, я был бы признателен.

Код:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RaceCar extends JFrame{


    public RaceCar(){
        add(new CarPic());
    }

    public static void main(String[] args){

        JFrame frame = new RaceCar();
        frame.setTitle("Brady Kedge: Race Car");
        frame.setSize(300, 150);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }



    public class CarPic extends JPanel implements KeyListener
    {
        private int x = 0;
        private int y = 150;
        private int z = 300;

        Timer mytimer = new Timer(50, new ActionListener());



        public CarPic()
        {
            mytimer.start();


        }



        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);

            y = getHeight();
            z = getWidth();

            g.setColor(Color.WHITE);

            g.fillRect(0, 0, z, y);

            Polygon polygon = new Polygon();
            polygon.addPoint(x + 10, y - 20);
            polygon.addPoint(x + 20, y - 30);
            polygon.addPoint(x + 30, y - 30);
            polygon.addPoint(x + 40, y - 20);

            if(x < z - 40)
            {
                g.setColor(Color.BLACK);
                g.fillOval(x + 10, y - 10, 10, 10);
                g.fillOval(x + 30, y - 10, 10, 10);
                g.setColor(Color.BLUE);
                g.fillRect(x, y - 20, 50, 10);
                g.setColor(Color.BLUE);
                g.fillPolygon(polygon);

            }

            else
                x = 0;
            }



        public void actionPerformed(ActionEvent e){
            x+=10;
            repaint();
        }

        @Override
        public void keyTyped(KeyEvent k) {
            //Fill

        }

        @Override
        public void keyPressed(KeyEvent k) {
            int delay = mytimer.getDelay();
            if(k.getKeyCode() == KeyEvent.VK_UP)
                mytimer.setDelay(delay > 10 ? delay - 10 : 0);
            else if(k.getKeyCode() == KeyEvent.VK_DOWN)
                mytimer.setDelay(delay < 5000 ? delay + 10 : 5000);

        }

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

        }

    }
}

person bkedge    schedule 08.05.2014    source источник


Ответы (1)


Во-первых, вы никогда не регистрируете KeyListener в своем компоненте (недостаточно реализовать KeyListener).

Во-вторых, KeyListener вызовет KeyEvents только в том случае, если компонент, на который он зарегистрирован, имеет фокус и доступен для фокусировки.

Лучшим решением было бы использовать API привязки клавиш, который предоставляет вам средства для настройки уровня фокуса, при котором компонент будет запускать ключевые события.

Кроме того, лично вместо изменения задержки Timer я бы использовал модификатор скорости (типа double), который будет процентом от скорости, которую вы хотите. Таким образом, 1 будет нормальная скорость, 0.5 половинная скорость и 2 двойная скорость, например.

person MadProgrammer    schedule 08.05.2014
comment
Хм. После прочтения о привязках клавиш кажется, что их проще реализовать, но я никогда не знал о них, потому что в нашей книге они никогда не упоминались. - person bkedge; 09.05.2014
comment
Да, они были представлены где-то в Java 1.4/5, поэтому шрифты часто упоминаются в старых книгах. - person MadProgrammer; 09.05.2014