bkedge
bkedge

Reputation: 105

Java Key Events and Timer control

Im almost finished with this car project im working on but cant seem to get the key events to work. I think it has to do with my action listener with my timer but im not sure. When I press the up arrow key the timer delay is supposed to decrease and vice versa for the down arrow key. I have the commands written but they are not registering input. If anyone could give me some pointers I'd appreciate it

Code:

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

        }

    }
}

Upvotes: 0

Views: 223

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347314

First of all, you never register a KeyListener with your component (implementing KeyListener isn't enough).

Second of all, KeyListener will only raise KeyEvents if the component it is registered to has focus and is focusable.

A better solution would be to use the key bindings API, which provides you with the means to configure the focus level at which a component will trigger key events.

Also, personally, instead of modifying the Timer delay, I would have use a speed modifier (of type double) which would be percentage of the speed you want. In this way 1 would normal speed, 0.5 half speed and 2 double speed, for example.

Upvotes: 1

Related Questions