java - KeyListener 在 Java swing 中没有响应

标签 java swing keylistener

我正在制作一款游戏,我有一个完美运行的主菜单。当我选择其中一个选项时,它会在新窗口中显示另一个菜单。但是在这个新窗口中,KeyListener 没有响应。如果我单击回到主菜单窗口,KeyListener 仍然在那里工作。这是代码:

主菜单:

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) {}
}

水平跳跃:

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) {}

}

我不太确定问题出在哪里,Level Skip 窗口显示正常,只是没有记录任何按键操作。

最佳答案

如果您搜索过这个问题,您会发现它几乎总是意味着正在收听的组件没有焦点。 90% 的时间解决方案是使用 Key Bindings .

您的另一个问题是您正在比较字符串 == .你不想这样做。请改用 equals 或 equalsIgnoreCase(...) 方法。了解 == 检查两个 对象 是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,并且这才是最重要的。所以不是

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

做,

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

或者,

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

你也是

  • 调用 paint(...)直接地,你几乎不应该做的事情。
  • 在顶层窗口的 paint(...) 中绘图您还应该避免使用的方法,而不是在 JPanel 的(或其他 JComponent)中绘制 paintComponent(...)方法。
  • 不在方法开始时调用 paint 或 paintComponent 的 super 方法
  • 将程序逻辑放在 paint 或 paintComponent 方法中。
  • 等...

在进一步向专家学习之前,您需要先完成 Swing 教程。

关于java - KeyListener 在 Java swing 中没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10359683/

相关文章:

java - 寻找两个嵌套while循环的循环不变式java

java - 来自 ObjectInputStream 构造函数的 EOFException

java - 即使在单独的线程中实现 sleep 后,GUI 执行也不会延迟

java - Java GWT中如何拦截KeyPressEvent?

java - 不同的回车和鼠标点击事件

javascript - Selenium 网络驱动程序 : Can't access element containing onclick and text attributes

java - 我应该测试返回的类型是否与所需的类型一致吗? (多态性)

java - JFrame + JDialog 到 JFrame

java - JFrame添加滚动条

java - 如何为 JFrame 的所有组件创建 KeyListener 触发器?