简体   繁体   中英

KeyListener not responding in Java swing

I'm making a game, and I have a Main Menu that works perfectly. When I select one of the options, it brings up another Menu in a new window. However in this new window, the KeyListener is not responding. If I click back to the Main Menu window, the KeyListener is still working there. Here is the code:

MainMenu:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;

public class DisplayMainMenu extends JFrame implements KeyListener{

  static int width = 799, height = 463;
  int arrowPos = 310;
  boolean clear = true;
  BufferedImage menu = null;
  BufferedImage arrow = null;
  LevelSkip test = new LevelSkip();
  boolean done = false;
  static DisplayMainMenu main;

  public static void main(String[] args){
    main = new DisplayMainMenu();
    main.setResizable(false);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);
    main.init();
  }

  public void init() {
    try{
      menu = ImageIO.read(new File("Main Menu.png"));
      arrow = ImageIO.read(new File("arrow.png"));
    }catch(IOException ie) {
      System.out.println(ie.getMessage());
    }
    this.setSize(width, height);
    this.addKeyListener(this);
    clear = true;
    paint(getGraphics());
  }

  public void paint (Graphics g){
    if(clear==true){
      g.drawImage(menu,0,0,null);
      clear = false;
    }
    g.drawImage(arrow,275,arrowPos,null);
  }
  public void keyPressed(KeyEvent e){
    String key = e.getKeyText(e.getKeyCode());
    if(key == "Up"){
      clear = true;
      if (arrowPos > 310)
        arrowPos -= 30;
      else
        arrowPos = 370;
      paint(getGraphics());
    }
    if(key == "Down"){
      clear = true;
      if (arrowPos < 370)
        arrowPos += 30;
      else
        arrowPos = 310;
      paint(getGraphics());
    }
    if(key == "Space"){
      done = true;
      switch(arrowPos){
        case 310:  System.out.println("RUN NEW GAME"); test.init();
          break;
        case 340:  System.out.println("RUN HIGH SCORES");
          break;
        case 370:  System.exit(0);
      }
    }
  }
  public void keyReleased(KeyEvent e) {}
  public void keyTyped(KeyEvent e) {}
}

LevelSkip:

import java.awt.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;

public class LevelSkip extends JFrame implements KeyListener {

  static int width = 799, height = 463;
  int arrowPos = 109;
  boolean clear = true;
  BufferedImage menu = null;
  BufferedImage arrow = null;

  public void init() {
    LevelSkip main = new LevelSkip();
    main.setSize(width, height);
    main.requestFocusInWindow();
    main.addKeyListener(main);
    main.setResizable(false);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setVisible(true);
    try{
      menu = ImageIO.read(new File("level skip.png"));
      arrow = ImageIO.read(new File("arrow2.png"));
    }catch(IOException ie) {
      System.out.println(ie.getMessage());
    }
    clear = true;
    paint(main.getGraphics());
  }

  public void paint (Graphics g){
    if(clear==true){
      g.drawImage(menu,0,0,null);
      clear = false;
    }
    g.drawImage(arrow,arrowPos,355,null);
  }
  public void keyPressed(KeyEvent e){
    String key = e.getKeyText(e.getKeyCode());
    if(key == "Left"){
      clear = true;
      if (arrowPos > 109)
        arrowPos -= 260;
      else
        arrowPos = 629;
      paint(getGraphics());
    }
    if(key == "Right"){
      clear = true;
      if (arrowPos < 629)
        arrowPos += 260;
      else
        arrowPos = 109;
      paint(getGraphics());
    }
    if(key == "Space"){
      switch(arrowPos){
        case 109:  System.out.println("ADD 1 TO LEVEL AND RUN BATTLE");
        break;
        case 369:  System.out.println("ADD 5 TO LEVEL AND RUN BATTLE");
        break;
        case 629:  System.out.println("ADD 10 TO LEVEL AND RUN BATTLE");
      }
    }
  }
  public void keyReleased(KeyEvent e) {}
  public void keyTyped(KeyEvent e) {}

}

I'm not exactly sure what the problem is, the Level Skip window displays fine, it just doesn't register any key presses.

If you've searched on this problem at all, you'll see that it almost always means that the component being listened to doesn't have focus. 90% of the time the solution is to use Key Bindings .

Your other problem is that you're comparing Strings == . You don't want to do this. Use the equals or the equalsIgnoreCase(...) method instead. Understand that == checks if the two objects are the same which is not what you're interested in. The methods on the other hand check if the two Strings have the same characters in the same order, and that's what matters here. So instead of

if (fu == "bar") {
  // do something
}

do,

if (fu.equals("bar")) {
  // do something
}

or,

if (fu.equalsIgnoreCase("bar")) {
  // do something
}

You're also

  • calling paint(...) directly, something you should almost never do.
  • Drawing in a top level window's paint(...) method which you also should avoid instead of drawing in a JPanel's (or other JComponent) paintComponent(...) method.
  • Not calling the paint or paintComponent's super method at the start of the method
  • Putting program logic in a paint or paintComponent method.
  • etc...

You will want to go through the Swing tutorials before going much further to learn from the pros.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM