在CardLayout中向面板添加keylistener

时间:2012-05-20 17:52:23

标签: java swing cardlayout

我正在写一个简单的游戏,我在CardLayout中放置了4个JPanel的主框架。 主框架看起来像这样:

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面板对键盘输入做出反应。首先我尝试了keylistener:

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"); 

3 个答案:

答案 0 :(得分:3)

试试这个:

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

编辑:对于reference,“每个JComponent都有一个动作地图和三个输入地图。”

答案 1 :(得分:2)

使用Action,图示为here,您可以将密钥(或组合)绑定到Action,如图here所示。有关其他指导,请使用其中一个或两个示例编辑您的问题以包含sscce

答案 2 :(得分:1)

我不知道这是否是你真正想要的,但如果你想在“GameScene”卡片中对关键事件作出反应,你应该首先切换到这张卡片(至抓住焦点):

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

同时查看您的代码 - 请考虑使用JMenu和/或JTabbedPane