Normen Yu
Normen Yu

Reputation: 79

How to see if a keyboard key is pressed without using text fields?

I am trying to create a very simple game that moves a ball up/right/left/down if you press the keys up/right/left/down. I looked up at different places, and here is what I made:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game extends JPanel implements KeyListener {
    static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    static int width = (int)screenSize.getWidth();
    static int height = (int)screenSize.getHeight();
  static  int x = width/2;
  static int y = height/2;
    boolean a=true;
    boolean b=true;
    public void keyTyped(KeyEvent e){
        //nothing here
    }
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch( keyCode ) { 
            case KeyEvent.VK_UP:
               x=x+10; 
        case KeyEvent.VK_DOWN:
            x=x-10;
        case KeyEvent.VK_LEFT:
            y=y+10;
        case KeyEvent.VK_RIGHT :
            y=y-10;
     }
}
public void keyReleased(KeyEvent e){
    //nothing here
}
@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
  g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.fillOval(x, y, 30, 30);
}

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

    JFrame frame = new JFrame("Sample");
    Game game = new Game();
    frame.add(game);
    frame.setSize(width,height);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    while (true) {
       game.keyPressed(null);
        game.repaint();
    }
}
}

But how do I "run" the keyPressed program? I saw some YouTube videos that said do something like"addKeyListener" or "addActionListener", but that mean adding a text field, text box, or text area, which I don't want. This is suppose to resemble a game after all. Thanks

edited version after looking at answers:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game extends JPanel implements KeyListener {
    static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    static int width = (int)screenSize.getWidth();
    static int height = (int)screenSize.getHeight();
    static  int x = width/2;
    static int y = height/2;
    boolean a=true;
    boolean b=true;
    static Game game;
    public Game(){
        addKeyListener(this);
    }

    public void keyTyped(KeyEvent e){
        //nothing here
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // nothing here

    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch( keyCode ) { 
            case KeyEvent.VK_UP:
               x=x+100; 
            case KeyEvent.VK_DOWN:
                x=x-100;
            case KeyEvent.VK_LEFT:
                y=y+100;
            case KeyEvent.VK_RIGHT :
                y=y-1000;
         }
        game.repaint();
    }


    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillOval(x, y, 30, 30);
    }

    public static void main(String[] args)throws InterruptedException {
        JFrame frame = new JFrame("Sample");
        game = new Game();
        frame.add(game);
        frame.setSize(width,height);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


}

Upvotes: 0

Views: 82

Answers (2)

user4624062
user4624062

Reputation:

In your constructor , add

     Game()
     {
          /*your code*/
          addKeyListener(this);
     }

Upvotes: 3

AlanK
AlanK

Reputation: 9833

You can add the keylistener to your Game object during construction.

    addKeyListener(new KeyAdapter()
    {
        @Override
        public void keyPressed(KeyEvent e)
        {
            myKeyEvt(e, "keyPressed");
        }

        private void myKeyEvt(KeyEvent e, String text)
        {
            int key = e.getKeyCode();
            if (key == KeyEvent.VK_KP_UP || key == KeyEvent.VK_UP)
            {
                //up
            }
            else if (key == KeyEvent.VK_KP_DOWN || key == KeyEvent.VK_DOWN)
            {
                //down
            }
            else if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT)
            {
                //left
            }
            else if (key == KeyEvent.VK_KP_RIGHT|| key == KeyEvent.VK_RIGHT)
            {
                //right
            }
        }
    });

Also, you will want to update your while loop to give it time to pause and refresh

    while (alive)
    {
        update();
        repaint();
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

Upvotes: 0

Related Questions