| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5229 人关注过本帖
标题:如何给一个按钮添加快捷键
只看楼主 加入收藏
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
如何给一个按钮添加快捷键
我向设计一个按钮类,直接从Component类派生,界面基本上和WindowsXP SP3按钮相仿,按钮的设计上基本上完成,包括按钮快捷键下划线的显示和处理,但是想给按钮添加快捷键的动作时遇到了难题,因为在使用快捷键时按钮控件基本上不是输入焦点,因此也无法触发键盘事件,不知道谁能指点我,要求:
1、触发快捷键的事件应该在按钮类之内,而不是在其父窗口处理快捷键事件。
2、要求使用基本的GUI组件,不能使用Swing组件。
3、在父窗口内输入快捷键时,不管焦点位于哪个控件上,应该都能够触发这个控件的快捷键事件,就如java的菜单项的动作一样。
搜索更多相关主题的帖子: 按钮 
2009-09-14 23:21
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
实际上就是要求能够在组件中监控父窗口的按键事件,并监听到发生快捷键按键事件时触发一个ActionEvent的单击事件以便父窗口处理按钮事件
2009-09-15 08:45
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
没有回复怎么结帖啊。
2009-09-17 00:58
迷你龙
Rank: 2
等 级:论坛游民
帖 子:20
专家分:16
注 册:2009-9-13
收藏
得分:3 
大概明白你的意思~~但我初学~~帮不了你!对于结贴:不是有两种方法的吗?选第二种就行了吧~~~
2009-09-17 07:07
lampeter123
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:54
帖 子:2508
专家分:6424
注 册:2009-1-30
收藏
得分:0 
期待高手帮你解答,我没有对这方面特别研究,用JAVA写GUI有点难,不像VC那么得心应手

你的优秀和我的人生无关!!!!
    
    我要过的,是属于我自己的生活~~~
2009-09-17 07:59
windizual
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:124
专家分:186
注 册:2009-7-1
收藏
得分:2 
LZ请参考API文档里面
索引:keyevent的内容,应该有你要的答案

Java要学的东西好多~~~~~
2009-09-17 10:39
gameohyes
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:53
帖 子:1275
专家分:3629
注 册:2009-3-5
收藏
得分:15 
(网上摘抄)
例:JAVA的计算器,鼠标点击操作完全正常,但是小键盘的数字键不能作为快捷键控制按钮,必须按下大键盘上的数字才可以。我应该怎么办,使得快捷键设置在小键盘上?我现在用的是
InputMap imap=panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("1"),"panel.one");
ActionMap amap=panel.getActionMap();
amap.put("panel.one",one);
这样形成的动作映射,请教如何设


可以这样设:
KeyStroke getKeyStroke(KeyEvent.VK_NUMPAD1,
                                     0)
这个是小键盘的1的键值。你再把这个动作映射再加上去。最后的数字2就是对应小键盘的2.

C#超级群 74862681,欢迎大家的到来!
2009-09-17 15:23
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
此问题最终解决方法:
在按钮控件的paint()方法中增加如下语句:
        // 将父窗口所有组件的键盘输入事件加入侦听器
        Component[] comp = getParent().getComponents();
        if(comp != null){
            for(int i = 0; i<comp.length;i++){
                comp[i].addKeyListener(this);
            }
        }
         
        // 将父窗口键盘输入事件加入到侦听器
        getParent().addKeyListener(this);

    然后让按钮类实现KeyListener接口,以侦听父窗口及其所有组件的键盘事件,并在按钮CButton类的KeyTyped()方法中进行过滤并触发ActionEvent事件通知父窗口处理,父窗口除了对ActionEvent事件进行处理外,无需编写任何代码,完美解决了上述问题。
小结:
    我原来将上述代码放在了CButton的构造函数中,此时父窗口尚未构造完成,所以执行时抛出
NullPointerException异常,意思就是父窗口对象不存在,加入到paint()方法后,上述代码执行时,父窗口已构造完成,在内存中已有固定的内存区域与之对应,故不再抛出异常。
        
2009-09-20 22:07
gameohyes
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:53
帖 子:1275
专家分:3629
注 册:2009-3-5
收藏
得分:0 
感谢分享

C#超级群 74862681,欢迎大家的到来!
2009-09-20 22:27
快速回复:如何给一个按钮添加快捷键
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011800 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved