java - Call "addkeylistener" on JPanel object or JFrame object -


all.

i got confused how event handling stuff works. can give me hints, thank!

here understand, in order event handling, there 3 steps: (1) implement listener (action, key, ...) (2) provide event handler (actionperformed ...) (3) register listener source (this step got confused)

i had see people doing addkeylistener on jpanel object, , doing on jframe object. personally, try both, , event can handle, , can not be, depend on either jpanel obj. or jframe obj choose addkeylistener.

so, in kind of situation can determine either jpanel or jpanel should used, , other object have similar issue?

thank you!


below practice code of trying make snake game. not done yet, has issue described, calling addkeylistener work on jframe, fail on jpanel.

snake.java

package com.snake;  import javax.swing.*; import java.awt.*; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyevent; import java.awt.event.keylistener; import java.util.arraylist; import java.util.random;   public class snake implements actionlistener, keylistener {      public static snake snake;     public dimension dimension;     public jframe jframe;     public renderpanel renderpanel;     public arraylist<point> snakeparts = new arraylist<>();     public static final int = 0, down = 1, left = 2, right = 3, scale = 10;     public int ticks = 0, direction = down, score, taillength;     public point head, cherry;     public random random;     public boolean hitedge, putnewcherry;     public timer timer;       public snake() {         dimension = toolkit.getdefaulttoolkit().getscreensize();         jframe = new jframe("snake");         jframe.setvisible(true);         jframe.setdefaultcloseoperation(jframe.exit_on_close);         jframe.setsize(500, 500);         jframe.setlocation((dimension.width - jframe.getwidth()) / 2, (dimension.height - jframe.getheight()) / 2);         jframe.add(renderpanel = new renderpanel());         jframe.addkeylistener(this);                                                    // add keylistener (1)         jframe.setfocusable(true);         random = new random();         cherry = new point(random.nextint(jframe.getwidth()) + 0, random.nextint(jframe.getheight() + 0));         head = new point(0, 0);                     // head needs instantiated         hitedge = false;         putnewcherry = true;         timer = new timer(20, this);         timer.start();     }      // ---------------------------------------------------------------------------- control snake pressing "i, j, k, l"     @override     public void keytyped(keyevent e) { //        system.out.println("keypressed="+keyevent.getkeytext(e.getkeycode()));     }      @override     public void keypressed(keyevent e) {         int = e.getkeycode();          if (i == keyevent.vk_i && direction != down) {             direction = up;             system.out.println("up");         }         if (i == keyevent.vk_k && direction != up) {             direction = down;             system.out.println("down");         }         if (i == keyevent.vk_j && direction != right) {             direction = left;             system.out.println("left");         }         if (i == keyevent.vk_l && direction != left) {             direction = right;             system.out.println("right");         }     }      @override     public void keyreleased(keyevent e) {     }       // ---------------------------------------------------------------------------- make snake moving     @override     public void actionperformed(actionevent e) {         renderpanel.repaint();         ticks++;          // ---------------------------------------------------------------------------- determine direction         if (ticks % 10 == 0 && head != null && hitedge != true) { //            snakeparts.add(new point(head.x, head.y));             if (direction == up) {                 if (head.y - 1 > 0) { //                    head = new point(head.x, head.y - 1);                         // option (1)                     snakeparts.add(new point(head.x, head.y--));                    // option (2), can replaced (1)                 } else {                     hitedge = true;                 }             }             if (direction == down) {                 if (head.y + 1 < dimension.height / scale) { //                    head = new point(head.x, head.y + 1);                         // option (1)                     snakeparts.add(new point(head.x, head.y++));                    // option (2), can replaced (1)                 } else {                     hitedge = true;                 }             }             if (direction == left) {                 if (head.x - 1 > 0) { //                    head = new point(head.x - 1, head.y);                         // option (1)                     snakeparts.add(new point(head.x--, head.y));                    // option (2), can replaced (1)                 } else {                     hitedge = true;                 }             }             if (direction == right) {                 if (head.x + 1 < dimension.width / scale) { //                    head = new point(head.x + 1, head.y);                         // option (1)                     snakeparts.add(new point(head.x++, head.y));                    // option (2), can replaced (1)                 } else {                     hitedge = true;                 }             }  //            snakeparts.add(new point(head.x, head.y));                            // option (1)              //  ---------------------------------------------------------------------------- remove tail part each time maintain whole body length same             snakeparts.remove(0);              // each cherry, gain longer length, score             if (cherry != null && head.equals(cherry)) {                 score += 100;                 taillength++;                 // reset cherry's location == put new cherry.                 cherry.setlocation(random.nextint(jframe.getwidth()) + 0, random.nextint(jframe.getheight() + 0));             }              //  ----------------------------------------------------------------------------         }       } } 

renderpanel.java

import javax.swing.*; import java.awt.*;  public class renderpanel extends jpanel {   //    public static int cherryx, cherryy;  //    // instantiate renderpanel register snake keylisterner //    public renderpanel(){ //        addkeylistener(snake.snake);                                              // add keylistener (1) ??? //        setfocusable(true); //        system.out.println("call renderpanel"); //    }     @override     protected void paintcomponent(graphics g) {         super.paintcomponent(g);          // paint background         g.setcolor(color.black);         g.fillrect(0, 0, 500, 500);          // pain snake body         snake snake = snake.snake;         g.setcolor(color.white);        // assign new color snake's body         (point snakepart : snake.snakeparts) {          // loop paint each part of snake body             g.fillrect(snakepart.x * snake.scale, snakepart.y * snake.scale, snake.scale, snake.scale);         }         g.fillrect(snake.head.x * snake.scale, snake.head.y * snake.scale, snake.scale, snake.scale);          g.setcolor(color.red);         g.fillrect(snake.cherry.x, snake.cherry.y, snake.scale, snake.scale);      } } 

main.java

public class main {      public static void main(string[] args) {         snake.snake = new snake();     } } 


Comments

Popular posts from this blog

java - Run spring boot application error: Cannot instantiate interface org.springframework.context.ApplicationListener -

reactjs - React router and this.props.children - how to pass state to this.props.children -

Excel VBA "Microsoft Windows Common Controls 6.0 (SP6)" Location Changes -