我正在写一个简单的游戏,我在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");
答案 0 :(得分:3)
试试这个:
setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW));
编辑:对于reference,“每个JComponent都有一个动作地图和三个输入地图。”
答案 1 :(得分:2)
答案 2 :(得分:1)
我不知道这是否是你真正想要的,但如果你想在“GameScene”卡片中对关键事件作出反应,你应该首先切换到这张卡片(至抓住焦点):
CardLayout cl = new CardLayout();
panel = new JPanel(cl);
...
add(panel, BorderLayout.CENTER);
cl.show(panel, "GameScene");
同时查看您的代码 - 请考虑使用JMenu
和/或JTabbedPane
。