今天接着做俄罗斯方块,在完成基本功能后,准备添加按钮,比如“开始游戏”,“暂停游戏”等按钮功能……遇到了问题。
本来JFrame中只有一个GamePanel,而且启动游戏是直接调用controller中的startGame方法,一切运行正常,键盘按键可以监听,即实现KeyListener的Controller有效。
因为要添加按钮和其他显示信息的模块,所以准备新建一个OptionPanel用于装button、label等组件,再将OptionPanel添加到JFrame中即可……
问题出现了,当添加了OptionPanel到JFrame中后,点击“开始游戏”,调用controller的startGame方法,启动游戏,游戏启动正常,而键盘的监听失效了……
又试着将添加OptionPanel的语句注释掉,运行,又可以了……
google了一下,有人也曾经遇到过这样的问题,说是JFrame中添加了两个JPanel后KeyListener失效,比较多的提到的解决方法是用JFrame的setFocusable(true),可我也试过了,没成功……
再次测试,JFrame中添加两个JPanel,直接用controller的startGame方法启动游戏,可行!所以排除了上面所说的是因为添加了两个JPanel的原因。
而,若启动游戏改成用OptionPanel中的button的ActionListener监听调用controller的startGame方法,键盘又再次失效……网上也有人问到是不是ActionListener和KeyListener有冲突……个人认为,是没有的,肯定有什么其他原因……
最后的解决方法是,在每个button中都添加KeyListener(controller)……这应该也是聚焦的问题,难道焦点都聚在了button上了?可是用isFocusable方法测试JFrame和JPanel都也一样有焦点啊……很奇怪……
虽然程序可以运行了,可是这样的解决方案真的让人费解,也不合理……等待以后更深的理解……