浏览 2460 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-04-21
首先想到了editable的JComboBox,发送命令后将其添加到JComboBox中,需要历史命令时下拉选择。经测试发现一个很严重的问题:当JComboBox中添加有相同的命令时,键盘的上下键无法遍历下拉列表,会在相同命令间循环,必须通过鼠标操作。这显然不满足要求,故而萌发了定制一个JComboBox的想法。 仿照JComboBox的做法:由一个文本框editor、一个下拉按钮button、一个弹出菜单popup(包含一个可滚动的列表框list)组成。文本框响应按键事件——上下键按下时弹出选择框(仅响应由文本框触发的事件,不对转发的事件响应);下拉按钮响应鼠标单击事件弹出选择框;弹出菜单中的列表框响应按键事件——ENTER按下时表示确定选择,并转发键入事件,响应鼠标单击事件——确定选择。 提供部分JComboBox类似的接口:添加选项,获得当前选中项。 可添加KeyListener,并将其添加到editor上。 其中碰到两个了比较大的问题: (1)如何实现类似JComboBox的下拉按钮。开始不知道,还琢磨用图标实现呢,看了JComboBox才发现,原来有BasicArrowButton,而且还是不同平台实现的; (2)弹出菜单中的列表框无法获取焦点(鼠标单击下拉按钮或文本框中按下上下键),使用list.requestFocusInWindow()无论如何就是无法获得焦点,以至于没法通过键盘的上下键选择。经查,尝试list.grabFocus(),居然获取到了!!不过grabFocus()方法有以下说明:“This method is intended for use by focus implementations. Client code should not use this method; instead, it should use requestFocusInWindow().”,不过没办法了,能用最重要!(当然,还有一点很重要,弹出菜单必须能获得得焦点) 希望有相同需求的人测试改建! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-04-22
使用示例:
定义 LJComboBox comboBox = new LJComboBox(); 添加键盘事件 comboBox.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (KeyEvent.VK_ENTER == c) { // Enter String command = (String) sendDataComboBox .getSelectedItem(); // handle .... } } }); |
|
返回顶楼 | |
发表时间:2013-04-22
使用示例:
定义 LJComboBox comboBox = new LJComboBox(); 添加键盘事件 comboBox.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (KeyEvent.VK_ENTER == c) { // Enter String command = (String) sendDataComboBox .getSelectedItem(); // handle .... } } }); |
|
返回顶楼 | |