1

これを間違った場所 ( GameDev) に投稿したのですが、そこで応答がありませんでした。というわけで、ここに再掲します。

アプレット ゲームを作成しています。レンダリング中です。ゲーム ループは実行中です。アニメーションは更新中ですが、キーボード入力が機能しません。これがSSCCEです。

public class Game extends JApplet implements Runnable {

    public void init(){
        // Initialize the game when called by browser
        setFocusable(true);
        requestFocus();
        requestFocusInWindow();  // Always returning false
        GInput.install(this);    // Install the input manager for this class
        new Thread(this).start();
    }

    public void run(){
        startGameLoop();
    }

}

そして、これが GInput クラスです。

public class GInput implements KeyListener {

    public static void install(Component c){
        new GInput(c);
    }

    public GInput(Component c){
        c.addKeyListener(this);
    }

    public void keyPressed(KeyEvent e){
        System.out.println("A key has been pressed");
    }

    ......

}

これは私の GInput クラスです。アプレットとして実行すると動作せず、Game クラスをフレームに追加すると正常に動作します。

ありがとう

今解決しました。私の解決策を見る

4

3 に答える 3

4

考えられる解決策の 1 つは、JApplet の contentPane を使用して、JApplet 自体ではなくコンテンツにフォーカスを設定することです。しかし、私の好みは、代わりにキー バインディングを使用することです。これを機能させるには、Swing Timer を使用する必要がある場合があります。

私のSSCCE:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

@SuppressWarnings("serial")
public class AppletKeyListen extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               setFocusable(true);

               int timerDelay = 100;
               Timer myTimer = new Timer(timerDelay , new ActionListener() {

                  @Override
                  public void actionPerformed(ActionEvent arg0) {
                     boolean focusObtained = requestFocusInWindow();
                     System.out.println("focusObtained for JApplet: " + focusObtained);

                     Container contentPane = getContentPane();
                     contentPane.setFocusable(true);

                     focusObtained = contentPane.requestFocusInWindow();
                     System.out.println("focusObtained for contentPane: " + focusObtained);


                  }
               });
               myTimer.setRepeats(false);
               myTimer.start();
//               boolean focusObtained = requestFocusInWindow();
//               System.out.println("focusObtained: " + focusObtained);
//               
//               Container contentPane = getContentPane();
//               contentPane.setFocusable(true);
//               
//               focusObtained = contentPane.requestFocusInWindow();
//               System.out.println("focusObtained: " + focusObtained);

            }
         });
      } catch (InvocationTargetException | InterruptedException e) {
         e.printStackTrace();
      }
   }
}
于 2012-08-25T13:29:23.597 に答える
1

ブラウザで実行している場合は、おそらくアプレットをクリックしてフォーカスを与える必要があります。セキュリティ上の理由から、ほとんどのブラウザーでは、ユーザーがクリックしない限り、アプレットがキーボード フォーカスを取得することはできません。

したがって、直接フォーカス グラブを行う代わりに、マウス リスナーを追加しますinit()

addMouseListener(new MouseAdapter() {
   public void onMousePress(MouseEvent e) {
      requestFocus();
   }
});
于 2012-08-25T13:21:24.343 に答える
0

これで2つのオプションがあります。

  • JWSを使用する
  • アプレットモードを作成しないでください

今、私はという新しいクラスを作ろうとしましたGApplet。アプレットから機能する新しいJFrameにゲームをロードします。これで、Webからもフルスクリーンモードにアクセスできます。クラスへのリンクは次のとおりです。

GAppletクラス_

そして今、それはウェブスタートのように機能していて、実際にはアプレットです。

于 2012-08-27T01:45:17.930 に答える