论坛首页 Java企业应用论坛

定制JComboBox——实现历史命令的重复发送

浏览 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().”,不过没办法了,能用最重要!(当然,还有一点很重要,弹出菜单必须能获得得焦点)


希望有相同需求的人测试改建!
   发表时间: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 ....
}
}
});
0 请登录后投票
   发表时间: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 ....
}
}
});
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics