JAppletのJava Key Binding:どうしたのですか?

私は、プレイヤーが入力したキーに応答するゲームアプレットを作成しようとしています。私はこれを達成するためにキーバインディングを使用しようとしています。しかし、私はそれを働かせることはできません。アプレット(Appletviewerではアプレットビューアで正しく表示されているようですが、キーを押すと何も起こりません)。ブラウザで正しく表示されないため、ブラウザでテストすることができませんでした。

私はUbuntu上でSun Java 6を実行しています。私は、iBusがキーボード入力をアプレットにブロックするUbuntuバグに言及しました。しかし、私はiBusを稼働させていないし、他のアプレット(私が書いたものではない)でキーボード入力を使用することができた。

これまでのコードはここにあります

public class AlxTestVersion extends JApplet {
   private GridBagLayout layout;
   private GridBagConstraints layoutConstraints;
   private JPanel mainPanel;

   public void init() {
      this.setLayout ( new FlowLayout(FlowLayout.LEFT) );
      //Main frame.
      mainPanel = new JPanel();
      layout = new GridBagLayout();
      layoutConstraints = new GridBagConstraints();
      layoutConstraints.anchor = GridBagConstraints.NORTHWEST;
      layoutConstraints.fill = GridBagConstraints.NONE;
      mainPanel.setLayout(layout);
      mainPanel.setBackground(Color.pink);
      getContentPane().add(mainPanel);
      //Map display
      JPanel leftPanel = new JPanel();
      GlobalData.mainMap = new MapCanvas(9);
      addComponent(GlobalData.mainMap, 0, 0, 1, 1);
      /*
         Define other components...
      */
   }

public class MapCanvas extends JPanel {
   private int tileSize;
   private int mapTileWidth;
   private int mapOffset;
   private int mapDim;

   private MapSquare screenTiles[];

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      ImageIcon testImage = new ImageIcon("tiles/test_land.gif");
      int x,y;
      for (x=0;x

私が使ったことと、さまざまな場所で見つかった作業例との唯一の違いについては、キーストロークをアクションにマッピングする前に、入力マップにキーストロークを追加することです。私は順序を入れ替えようとしましたが、何の効果もないようです。

誰も私がここで間違っているのを見ることができますか?私はただの何かが分からないことを知っているだけです。

1
このも参照してください。
追加された 著者 trashgod,

1 答え

あなたのコードは私のために(mac上で)、私はウィンドウ内をクリックするまで動作しません。 init()の最後のものとして次のものを追加すると助けになります(ただし、全く信頼できるわけではありません):

GlobalData.mainMap.requestFocus();

キーを押すと、アプレットウィンドウにフォーカスがない可能性があります。

これをあなたのinit()に追加してみてください:

GlobalData.mainMap.addFocusListener(new FocusDebugger("canvas"));
this.addFocusListener(new FocusDebugger("applet"));

ここにFocusDebuggerがあります:

public static class FocusDebugger implements FocusListener {
    private final String name;

    public FocusDebugger(String name) {
        this.name = name;
    }

    public void focusGained(FocusEvent focusEvent) {
        System.out.println(name + ".focusGained");
    }

    public void focusLost(FocusEvent focusEvent) {
        System.out.println(name+".focusLost");
    }
}
1
追加された
どうもありがとうございました。ちょっと試してみた後、getContentPane()。requestFocus()もうまくいくように見えました。
追加された 著者 Leonide,