2012-04-28 3 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) {} 

} 

Я не совсем уверен, что проблема в том, окно Level Пропустить отображается нормально, это просто не зарегистрируйте любые нажатия клавиш.

+0

См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/a/9554657/418556) –

ответ

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.
  • и т.д ...

Вы хотите, чтобы пройти через Swing, учебники, прежде чем гораздо дальше, чтобы узнать от профи.

+1

+1 для заметок всех дополнительных очков. Я также взял на себя смелость добавить ссылку на учебник по связям с ключевыми словами на ваш пост, просто чтобы завершить его – Robin

Смежные вопросы