2012-04-28 119 views
3

我在做一个游戏,并且我有一个完美的主菜单。当我选择其中一个选项时,它会在新窗口中显示另一个菜单。但是在这个新窗口中,KeyListener没有响应。如果我点击返回主菜单窗口,KeyListener仍然在那里工作。下面是代码:KeyListener在Java swing中没有响应

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

} 

我不能完全确定是什么问题,水平跳过窗口显示细腻,它只是不注册任何按键。

+0

请参阅[多个JFrames的使用,好/坏实践?](http://stackoverflow.com/a/9554657/418556) – 2012-04-28 01:52:31

回答

7

如果你已经搜索了这个问题,你会发现它几乎总是意味着被监听的组件没有焦点。 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的超级方法
  • 将程序逻辑放在paint或paintComponent方法中。
  • 等...

你会希望才去更远从专业人士学习经历了Swing教程。

+1

+1注意到所有这些额外的点。我还冒昧地为您的帖子添加了一个链接到键绑定教程,只是为了使其完整 – Robin 2012-04-28 05:20:21