2012-04-28 11 views
3

私はゲームを作っていますが、私は完全に動作するメインメニューを持っています。オプションの1つを選択すると、別のメニューが新しいウィンドウに表示されます。しかし、この新しいウィンドウでは、KeyListenerは応答しません。メインメニューウィンドウに戻ると、KeyListenerはまだそこで動作しています。JavaスイングでKeyListenerが応答しない

の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) –

答えて

7

この問題を一度検索した場合、ほとんどの場合、リッスンされているコンポーネントにはフォーカスがないことがわかります。ソリューションが使用する時間の90%Key Bindings

その他の問題は、文字列==を比較していることです。あなたはこれをしたくありません。代わりにequalsまたはequalsIgnoreCase(...)メソッドを使用してください。あなたが興味を持っていない2つののオブジェクトが同じであるかどうかをチェックすることを理解しています。しかし、2つのStringが同じ文字を同じ順序で持つかどうかをチェックします。だからではなく、

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

行い、

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

または、

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

のあなたは、直接あなたが行うことはほとんどないはずです何かをpaint(...)を呼び出すことも

  • です。
  • JPanel(または他のJComponent)paintComponent(...)メソッドを描画するのではなく、トップレベルウィンドウのpaint(...)メソッドを描画する必要があります。
  • メソッドの開始時にpaintまたはpaintComponentのsuperメソッドを呼び出さない
  • paintロジックをpaintまたはpaintComponentメソッドに配置する。
  • 等...

あなたはプロから学ぶために多く、さらに行く前に、Swingのチュートリアルを通過することになるでしょう。

+1

+1これらの余分なポイントに気づいてください。私はあなたの投稿にキーバインディングのチュートリアルへのリンクを追加して、完全にするために自由を取った – Robin

関連する問題