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

最近需要用到一个功能:通过一个文本框编写命令,然后发送,需要记录这些历史命令,以便需要发送相同命令时直接选择,或者基于历史命令进行编辑后再发送。

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


希望有相同需求的人测试改建!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值