JComboBox是Java的Swing开发中比较常用的组件,但是默认的功能比较简单,在开发一个自己的小工具的时候,就希望能够通过上下方向键控制下拉框里Item的选中与否,并且希望能通过按Delete键对选中的Item进行删除,但是JComboBox从设计上就禁掉了对下来框里Item的各种事件的操作,所以实现起来就要换个思路,不能对下拉框里的Item进行绑定事件,因为他无法获取焦点,而焦点一直在JCombox的文本框里(我设置的是可编辑的JCombox),所以应该把事件加到JCombox的编辑框中,通过编辑框的KeyListener事件进行监听,代码如下:
package javax.swing; import java.awt.Color; import java.awt.Component; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; /** * * 带键盘事件的渲染器 * * @author 倪庆洋 <niqy@qq.com> * * @date 2015-1-17 下午05:34:02 * */ public class LabelCellRenderer extends JLabel implements ListCellRenderer, KeyListener { private static final long serialVersionUID = 1L; private JComboBox comboBox; private int selectedIndex = -1; /** * 构造函数 * * @param comboBox * 当前渲染器所属的JComboBox */ public LabelCellRenderer(final JComboBox comboBox) { setOpaque(true); this.comboBox = comboBox; this.comboBox.getEditor().getEditorComponent().addKeyListener(this); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { this.setText(value.toString()); this.setFont(this.comboBox.getFont()); Color background; Color foreground; if (isSelected) { background = Color.decode("#3399FE"); foreground = Color.WHITE; this.selectedIndex = index; } else { background = Color.WHITE; foreground = Color.BLACK; } setBackground(background); setForeground(foreground); return this; } @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == 38) {// 按向上的方向键则索引减一 int index = this.comboBox.getSelectedIndex(); if (index == 0) { return; } index--; this.comboBox.setSelectedIndex(index); } else if (keyCode == 40) {// 按向下的方向键则索引加一 int index = this.comboBox.getSelectedIndex(); if (index == this.comboBox.getItemCount() - 1) { return; } index++; this.comboBox.setSelectedIndex(index); }else if(keyCode == 127){ // 为防止误删除,只有在下来选项可视的情况下才可以执行删除操作 if (this.comboBox.isPopupVisible()) { // 下来选框可见的情况下,设置Delete对文本框内文字操作无效 JTextField textField = ((JTextField) this.comboBox.getEditor().getEditorComponent()); String text = textField.getText(); int position = ((JTextField) this.comboBox.getEditor().getEditorComponent()).getCaretPosition(); // 如果是按Delete键则移除当前选中的Item if (this.selectedIndex >= 0 && this.selectedIndex < this.comboBox.getItemCount()) { this.comboBox.removeItemAt(this.selectedIndex); textField.setText(text); textField.setCaretPosition(position); } //此处代码在JDK1.6起作用,在JDK1.7失效,请注意 e.setKeyCode(-1); } } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }
通过此渲染器对Item进行重新渲染,在渲染的过程中记录所选择的索引并进行键盘事件的监听。
调用如下:
package com.cntrust.file.test; import javax.swing.JComboBox; import javax.swing.JFrame; //自定义 import javax.swing.LabelCellRenderer; public class TestMain { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { JComboBox comboBox = new JComboBox(); //只有为true的时候才能进行删除 comboBox.setEditable(true); comboBox.setRenderer(new LabelCellRenderer(comboBox)); JFrame jFrame = new JFrame(); jFrame.add(comboBox); comboBox.addItem("张三"); comboBox.addItem("李四"); comboBox.addItem("王五"); comboBox.addItem("赵六"); jFrame.setSize(280, 60); jFrame.setVisible(true); } }
效果如下图:
删除前:
删除后:
相关推荐
实现下拉列表JComboBox中值和显示不同
主要介绍了Java Swing JComboBox下拉列表框的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java 建立可自行输入的JComboBox java 建立可自行输入的JComboBox java 建立可自行输入的JComboBox
能够通过JComboBox的选择实现动态生成jCombobox菜单,从而实现动态级联效果
一个多选的JComboBox完整例子,JComboBox下面包含JCheckBox
java JComboBox的使用 java JComboBox的使用 java JComboBox的使用
主要介绍了Java Swing组件下拉菜单控件JComboBox用法,结合具体实例形式分析了Swing组件下拉菜单控件JComboBox的具体定义、使用方法及相关使用注意事项,需要的朋友可以参考下
支持自动过滤可选项的JComboBox 支持键盘选择、鼠标选择
java JComboBox的事件处理 java JComboBox的事件处理 java JComboBox的事件处理
jcombobox,众所周知,java的下拉列表框,非常的难看-丑,该源码修改了其外表
组合框JComboBox;组合框JComboBox—事件;public class Test4 extends JFrame implements ActionListener { String[] items = { "篮球", "足球", "乒乓球" }; JComboBox<String> box = new JComboBox(items); Test4()...
Java实现下拉提示框,有点类似浏览器地址栏的下拉提示,这个是仿IE的,具体是使用javax.swing 包中的JComboBox 类来实现这个功能,调试时候请注意:本例中JComboBox 为默认编辑器,因此不用实现javax.swing....
关于swing组件JComboBox中中如何获得应用下拉単中的元素得到元素的Object
java 建立有图像的JComboBox java 建立有图像的JComboBox java 建立有图像的JComboBox
JComboBox动态绑定数据库实例,数据库为Sql2000,使用JDBC连接数据库
主要代码: this.setTitle("下拉框美化")... JComboBox<String> cb = new JComboBox(strArr); cb.setUI(new ComboBoxUIEx()); cb.setBounds(10, 10, 100, 50); container.add(cb); this.setVisible(true);
JComboBox自动过滤,很好用~,能添加到swing,无ui限制
NULL 博文链接:https://jisonami.iteye.com/blog/2181450
很久没用JAVA了,现在项目上需要在jtable里用jcombobox做显示,自己写了一些但是没有选择的时候没有下拉按钮,这个例子纠正了这个问题
JComboCheckBox JComboBox与JCheckBox结合源码。 网上下载代码,修改了一点点。。。上传,以备后用。。