KeyListener

     今天接着做俄罗斯方块,在完成基本功能后,准备添加按钮,比如“开始游戏”,“暂停游戏”等按钮功能……遇到了问题。

     本来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都也一样有焦点啊……很奇怪……

 

   虽然程序可以运行了,可是这样的解决方案真的让人费解,也不合理……等待以后更深的理解……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值