2

私は単純なゲームを書いています.4つのJPanelsがCardLayoutに配置されたメインフレームがあります。メインフレームは次のようになります。

private static JPanel[] panele = new JPanel[4];
private static JPanel panel;    
public GameWindow()
{
    super("Sokoban");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    panele[0] = new MainMenu();
    panele[1] = new LoadGameMenu();
    panele[2] = new SaveGameMenu();     
    panele[3] = new GameScene();        
    panel = new JPanel(new CardLayout());

    //((MainMenu)panele[0]).setSaveOptionState(false);
    panel.add(panele[0], "MainMenu");
    panel.add(panele[1], "LoadGameMenu");
    panel.add(panele[2], "SaveGameMenu");
    panel.add(panele[3], "GameScene");      
    add(panel, BorderLayout.CENTER);


}

GameScene パネルがキーボード入力に反応するようになりました。最初にキーリスナーを試しました:

public GameScene() {        
    setFocusable(true);
    initWorld(); //Drawing on JPanel takes place here       
    addKeyListener(new Keyboard());         
}
class Keyboard extends KeyAdapter
{
    private int key;
    public void keyPressed(KeyEvent event)
    {
        System.out.println("Tu jestem");
        key = event.getKeyCode();
        if(key == KeyEvent.VK_ESCAPE)
        {
            Game.gra = new GameWindow(MenuAction.MAIN_MENU);
            System.out.println("Escape");
        }

それはうまくいきませんでした...だから私はキーバインディングを試しました(簡単な実装):

public GameScene() {    

    setFocusable(true);
    initWorld();  //Drawing on JPanel takes place here      
   // requestFocus();
    setInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, getInputMap());
    KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
    getInputMap().put(key, "pressed");      
    getActionMap().put("pressed", new AbstractAction(){         
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("Spacja");
            //Game.gra = new GameWindow(MenuAction.MAIN_MENU);

        }

    });
}

まだ機能していません... requestFocus と requestFocusInWindow() を追加しようとしましたが、効果はありませんでした。それを修正する方法またはそれを行う方法はありますか?

解決策が見つかりました。キーバインディングでは、次のように書く必要があります。

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(key, "pressed");

の代わりに:

getInputMap().put(key, "pressed"); 
4

3 に答える 3

3

これを試して:

setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW));

編集:参考までに、「各 JComponent には 1 つのアクション マップと 3 つの入力マップがあります。」

于 2012-05-20T19:36:44.617 に答える
2

Actionここに示されているを使用すると、ここActionに示されているように、キー (または組み合わせ) を にバインドできます。追加のガイダンスについては、質問を編集して、いずれかまたは両方の例を使用してsscceを含めてください。

于 2012-05-20T19:34:30.867 に答える
1

これがあなたが本当に望んでいるものかどうかはわかりませんが、「GameScene」カードにいるときにキーイベントに単純に反応したい場合は、最初にこのカードに切り替える必要があります (フォーカスをつかむため):

        CardLayout cl = new CardLayout();
        panel = new JPanel(cl);
        ...
        add(panel, BorderLayout.CENTER);
        cl.show(panel, "GameScene");

コードも見てください - JMenuand/orの使用を検討してくださいJTabbedPane

于 2012-05-20T18:52:56.863 に答える