当前位置: 代码迷 >> Java相关 >> 如何给一个按钮添加快捷键
  详细解决方案

如何给一个按钮添加快捷键

热度:421   发布时间:2009-09-14 23:21:39.0
如何给一个按钮添加快捷键
我向设计一个按钮类,直接从Component类派生,界面基本上和WindowsXP SP3按钮相仿,按钮的设计上基本上完成,包括按钮快捷键下划线的显示和处理,但是想给按钮添加快捷键的动作时遇到了难题,因为在使用快捷键时按钮控件基本上不是输入焦点,因此也无法触发键盘事件,不知道谁能指点我,要求:
1、触发快捷键的事件应该在按钮类之内,而不是在其父窗口处理快捷键事件。
2、要求使用基本的GUI组件,不能使用Swing组件。
3、在父窗口内输入快捷键时,不管焦点位于哪个控件上,应该都能够触发这个控件的快捷键事件,就如java的菜单项的动作一样。
搜索更多相关的解决方案: 按钮  

----------------解决方案--------------------------------------------------------
实际上就是要求能够在组件中监控父窗口的按键事件,并监听到发生快捷键按键事件时触发一个ActionEvent的单击事件以便父窗口处理按钮事件
----------------解决方案--------------------------------------------------------
没有回复怎么结帖啊。
----------------解决方案--------------------------------------------------------
大概明白你的意思~~但我初学~~帮不了你!对于结贴:不是有两种方法的吗?选第二种就行了吧~~~
----------------解决方案--------------------------------------------------------
期待高手帮你解答,我没有对这方面特别研究,用JAVA写GUI有点难,不像VC那么得心应手
----------------解决方案--------------------------------------------------------
LZ请参考API文档里面
索引:keyevent的内容,应该有你要的答案
----------------解决方案--------------------------------------------------------
(网上摘抄)
例: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.
----------------解决方案--------------------------------------------------------
此问题最终解决方法:
在按钮控件的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()方法后,上述代码执行时,父窗口已构造完成,在内存中已有固定的内存区域与之对应,故不再抛出异常。
        
----------------解决方案--------------------------------------------------------
感谢分享
----------------解决方案--------------------------------------------------------
  相关解决方案