3

私はゲームを作っており、完全に機能するメイン メニューがあります。オプションの 1 つを選択すると、新しいウィンドウに別のメニューが表示されます。ただし、この新しいウィンドウでは、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) {}

}

何が問題なのか正確にはわかりません。レベル スキップ ウィンドウは正常に表示されますが、キーの押下が記録されません。

4

1 に答える 1

7

この問題について調べてみると、ほとんどの場合、リッスンされているコンポーネントにフォーカスがないことを意味していることがわかります。解決策の 90% はKey Bindingsを使用することです。

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

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

行う、

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

また、

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

あなたも

  • これは、ほとんどpaint(...)絶対に行うべきではありません。
  • JPanel (または他の JComponent) のメソッドで描画する代わりに、トップ レベル ウィンドウのpaint(...)メソッドで描画することも避ける必要がありますpaintComponent(...)
  • メソッドの開始時に paint または paintComponent のスーパー メソッドを呼び出さない
  • プログラム ロジックを paint または paintComponent メソッドに入れる。
  • 等...

プロから学ぶためにさらに先に進む前に、Swing チュートリアルを実行することをお勧めします。

于 2012-04-28T01:13:44.633 に答える