Jayesh Khullar
Jayesh Khullar

Reputation: 21

Coding Graphics and KeyListener in java

I was wondering how to properly use the Graphics library and also the Keylistener in JAVA. Underneath is my code, i believe i have done something wrong because the Window is blank with no Oval. Please help me out!

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Game extends JFrame implements KeyListener{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    int x=100,y=100;

    boolean u,d,r,l;

    public <addKeyListener> void run(){
        setBackground(Color.gray);
        setSize(800,800);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addKeyListener(this);
    }
    public static void main(String[] args) {
        Game game = new Game();
        game.run(); 
        }

    public void paint(Graphics g){
        g.setColor(Color.black);
        g.fillOval(x,y,40,40);
    repaint();
    }
    {


    if(u =true){
    y-=200;

    } 
    if(d = true){
    y+=2;
    }
    if(r = true){
        x-=2;
        }
    if(l = true){
        x+=2;}
    }








    @Override
    public void keyPressed(KeyEvent e) {
    char code = e.getKeyChar();
        if(code == KeyEvent.VK_W){
            u = true;}
            if(code == KeyEvent.VK_A){
                l = true;}
                if(code == KeyEvent.VK_S){
                    d = true;}
                    if(code == KeyEvent.VK_D){
                        r = true;}

    }



    @Override
    public void keyReleased(KeyEvent e) {
        char code = e.getKeyChar();
        if(code == KeyEvent.VK_W){
            u = false;}
            if(code == KeyEvent.VK_A){
                l = false;}
                if(code == KeyEvent.VK_S){
                    d = false;}
                    if(code == KeyEvent.VK_D){
                        r = false;}

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

}

Upvotes: 1

Views: 538

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

  1. You're drawing directly in the JFrame, something that is dangerous to do (as you're finding out).
  2. You're not calling the super's paint(...) method from within your paint override preventing the JFrame doing the painting that it itself needs to be doing.
  3. You're calling repaint() from within a painting method -- never do this.
  4. You've not read the painting in Swing tutorial yet.

Instead:

  1. Draw in a JPanel's paintComponent method.
  2. Call the super's paintComponent inside your override.
  3. Use Key Bindings not KeyListeners (Google for the tutorial as it will explain how to use these).

Check the Swing Info link for links to tutorials and resources.

For example

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class SimpleAnimationEg extends JPanel {
   private static final int OVAL_WIDTH = 20;
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private int x = 0;
   private int y = 0;

   public SimpleAnimationEg() {
      addKeyBindings();
   }

   private void addKeyBindings() {
      InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
      ActionMap actionMap = getActionMap();

      KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(0, -1));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(0, 1));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(-1, 0));

      keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
      inputMap.put(keyStroke, keyStroke.toString());
      actionMap.put(keyStroke.toString(), new MyAction(1, 0));
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.setColor(Color.RED);
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.fillOval(x, y, OVAL_WIDTH, OVAL_WIDTH);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class MyAction extends AbstractAction {
      private int xDirection;
      private int yDirection;

      public MyAction(int xDirection, int yDirection) {
         this.xDirection = xDirection;
         this.yDirection = yDirection;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         x += xDirection;
         y += yDirection;
         repaint();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleAnimationEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new SimpleAnimationEg());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Upvotes: 3

Related Questions