我不是很明白焦点在组件之间是怎样得失的,网上查资料说setfocusable()设置为false为不能获得焦点,设置为true为有机会获得焦点,可是为什么我在设置frame.setfocusable(false)时还是会触发它的监听事件,而且是有几率性的触发.不仅仅是frame,panel也有这种情况,所以请老师解答
David 发表于2017-09-01 14:44
http://blog.csdn.net/njnu_mjn/article/details/6462470/,这是位博主的帖子(内涵实例),希望可以对读者有所帮助。
老师,这篇文章对我的疑问没有用.他说的我都符合,我现在就是有个疑惑:键盘事件的响应与组件焦点有关,但是我两个组件都设置了setfocusable(false),按理说这两个组件应该不能获得焦点,只有frame能获得,可是我程序中(添加了焦点事件)会显示panel得到了焦点并且frame响应键盘事件,即使我把frame的键盘监听注释掉,再设置 panel.setFocusable(true);但是panel的键盘监听还是没用,所以我挺疑惑的.您看看我的代码吧,百度了好久没有用
根号申 发表于2017-09-04 09:40
你将frame的addFocusListener监听中所有输出都改成“System.out.println("frame-----得到");”再看看结果
呃呃,改了之后控制台显示焦点能正常显示了,但是还是有点问题,老师您看:
图一所示:只要我frame.setfocusable()设置为true(设置为false则所有监听都失效),后面的无论setfocusable(为true还是false),控制台都只会显示frame得到焦点并且也只有frame的监听有用,注释掉frame的监听控制台就什么也不输出,所以是不是这样写焦点只能在frame上面?
图二所示:我为jpanel子类的构造方法中设置setfocusable(true)居然又只能响应gamePanel的键盘监听,图中所示frame的键盘监听不能响应,无论frame.setfocusable设置什么gamePanel都能响应,但是如果不在其构造函数中写setfocusable(true)而是在主程序写(图三,与图一类似写法)则又只能响应frame的监听,所以是不是构造函数里面的setfocusable(true)优先级高一些?
静守时光以待流年 发表于2017-09-04 23:37
呃呃,改了之后控制台显示焦点能正常显示了,但是还是有点问题,老师您看:
图一所示:只要我frame.setfocusable()设置为true(设置为false则所有监听都失效),后面的无论setfocusable(为true还是false),控制台都只会显示frame得到焦点并且也只有frame的监听有用,注释掉frame的监听控制台就什么也不输出,所以是不是这样写焦点只能在frame上面?
图二所示:我为jpanel子类的构造方法中设置setfocusable(true)居然又只能响应gamePanel的键盘监听,图中所示frame的键盘监听不能响应,无论frame.setfocusable设置什么gamePanel都能响应,但是如果不在其构造函数中写setfocusable(true)而是在主程序写(图三,与图一类似写法)则又只能响应frame的监听,所以是不是构造函数里面的setfocusable(true)优先级高一些?
因为面板没有获得/失去焦点的功能,所以不会有反应,不像窗体之间是有焦点切换的。所以在开发应用上,焦点事件、键盘事件都应该依附在窗体上,而不是面板上。可以在面板切换之后,调用窗体的add...Listener()或remove...Listener()来更换监听内容。