java - 将 keylistener 添加到 CardLayout 中的面板

标签 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");
        }

那行不通...所以我尝试了键绑定(bind)(简单实现):

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() 但没有效果。有什么想法可以修复或执行吗?

已找到解决方案。在键绑定(bind)中我应该写:

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

代替:

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

最佳答案

试试这个:

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

编辑:reference , "每个 JComponent 都有一个 Action 图和三个输入图。"

关于java - 将 keylistener 添加到 CardLayout 中的面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675758/

相关文章:

java - 如何在 JTable 上添加工具提示以在鼠标悬停事件上显示特定列的单元格值

java - 在 DefaultTableModel 中插入单选按钮

java - AndroidManifest 虽然存在,但丢失了

java - 没有得到唯一的时间戳

java - 从 Mysql DB 读取图像并将其再次发送到 Java 中的 DB

java - GridBagLayout 行为不当。水平分布问题

java - 尝试执行 CardLayout 但运行 GUI 时不显示任何按钮

java - CardLayout - 使其占用最少的空间

java - UDP 服务器/客户端、java GUI、多项选择题

java - 使用 DynamoDBMapper 获取所有项目