`
niqingyang
  • 浏览: 44332 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

可编辑的组合框JComboBox实现可删除下拉选项效果

阅读更多

   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);
		
		
	}

}

   效果如下图:

 

删除前:

 删除后:

 

 

 

 

  • 大小: 24 KB
  • 大小: 20.9 KB
分享到:
评论

相关推荐

    Java Swing JComboBox下拉列表框的示例代码

    * setEditable(boolean flag):设置下拉列表框是否可编辑。 示例代码 以下是一个简单的示例代码,演示如何使用 JComboBox: ```java package com.xiets.swing; import javax.swing.*; import java.awt.event....

    java JComboBox的使用

    总之,`JComboBox` 是 Java GUI 开发中一个重要的组件,用于创建具有下拉菜单功能的选择框。理解和熟练掌握它的用法对于构建交互式应用程序至关重要。通过组合不同的监听器和自定义方法,我们可以实现丰富的用户交互...

    java JComboBox的事件处理

    - `addItem()`和`removeItem()`方法用于向组合框添加或删除选项。 - `setModel()`方法用于设置组合框的数据模型,可以是`DefaultComboBoxModel`或其他自定义模型。 - `setSelectedItem()`和`getSelectedItem()`...

    第二章第八节——组合框控件

    组合框(ComboBox)通常由两部分组成:一个可编辑的文本框和一个下拉列表。用户可以在文本框中输入文字,或者通过点击下拉箭头来选择列表中的预设选项。这种控件提供了灵活性,既可以允许用户自由输入,也可以限制...

    java swing综合程序

    在"Java Swing综合程序"中,我们将深入探讨如何使用Swing组件构建一个功能丰富的用户界面,包括菜单栏(JMenuBar)、工具栏(JPopupMenu)、组合框(JComboBox)、复选框(JCheckBox)和单选按钮(JRadioButton),...

    combox 实现搜寻功能

    它能够显示一个可编辑的文本字段和一个下拉列表,用户可以在其中选择一个选项或者手动输入文本。`JComboBox`通过其模型(`ComboBoxModel`)来管理其数据源。本文将深入探讨如何利用`JComboBox`实现自动搜寻功能,以...

    简易编辑器

    SWING提供了许多高级组件,如JTextComponent(包括JTextArea和JEditorPane)用于文本编辑,以及JMenu、JMenuItem等用于创建菜单和下拉菜单。这些组件使得我们可以实现剪切、复制、粘贴等基本编辑功能。通过调用...

    由Java实现简单的文本编辑器.doc

    7. **ItemListener**:这是Java AWT/Swing事件监听器接口,用于监听菜单项或组合框的选择变化。在代码中,当用户更改字体、样式或颜色时,会触发相应的事件处理,更新文本的显示。 8. **Font** 类:Java中的Font类...

    实例48调色板.doc

    7. **可编辑的组合框**: 通过`comboBox.setEditable(true);`设置`JComboBox`为可编辑状态,允许用户不仅从预设选项中选择,还能输入自定义颜色。 综上所述,这个实例展示了如何利用Java Swing组件创建一个实用的...

    ComboBoxDropDemo.zip

    `ComboBox`的基本结构包括一个可编辑的文本字段和一个下拉列表。在默认情况下,`ComboBox`的大小是固定的,不论其包含多少个items。但是,当items数量过多时,固定大小的下拉框可能会显得过于拥挤或者不协调。因此,...

    一个简单的JTABLE运用combox的例子

    `JComboBox`则是一个下拉选择框,允许用户从预定义的选项中进行选择。在`JTable`中集成`JComboBox`可以为用户提供更丰富的交互体验,例如在表格的某一列中提供可选的值。 本示例项目“一个简单的JTABLE运用combox的...

    swing hacking code

    这篇博文中,作者详细介绍了多个关键主题,包括但不限于列表、组合框、表格、树形视图、文本处理、拖放功能、透明窗口和动画效果,以及Swing与本地操作系统集成和打包的相关内容。 首先,我们来看看`Ch01-...

    0216_JavaGUI[归类].pdf

    - **组合框(JComboBox)**:下拉列表选择项,可编辑或不可编辑。 - **单选按钮(JRadioButton)**:一组中只能选中一个。 - **复选框(JCheckBox)**:可选中多个。 - **列表框(JList)**:列出一组选项供用户...

    推荐课程 完整版优质java教程 java精品教学课件 Java语言程序设计 第12章 swing 组件(共59页).ppt

    - 列表框(JList)和组合框(JComboBox):用于选择项列表。 - 菜单(JMenu、JMenuItem):创建下拉菜单和子菜单。 5. 多线程 Java的多线程特性允许程序同时执行多个任务,这对于处理耗时操作或实现并发非常有用...

    可视化组件:Swing JComponent总览

    3. **组合框(JComboBox)**:这是一个下拉列表控件,用于让用户从预设的选项中选择一个值,也可以允许用户自定义输入。可以通过多种方式初始化组合框,例如使用数组、集合或`ComboBoxModel`对象。当用户选择了一个...

    java控件示例代码(内还有完整系统一个)

    JTextField类是Swing中的实现,可以设定最大字符数、是否可编辑等属性。 3. **文本区域(TextArea)**:用于多行文本输入或显示,例如阅读代码或长篇文章。JTextArea类提供了滚动条和行数列数的设置。 4. **下拉菜单...

    GUI组件和设计PPT课件PPT学习教案.pptx

    5. **组合框JComboBox**:下拉列表,允许用户选择一个项。 6. **带滚动窗格的面板JScrollPane**:用于包含大型组件,如`JTextArea`,并提供滚动条。 7. **列表JList**:显示一组可选项目,用户只能选择单个或多个项...

    Java Swing Examples

    - **MultiComponentTable.java**:此示例展示了如何在一个单元格中组合多个组件(如 JComboBox、JCheckBox 和 JTextField)。 - **MultiComponentTable2.java**:提供了另一个使用多种组件的表格单元格示例。 - **...

    NIIT SM2考试试题

    组合框(`JComboBox`)是Swing框架中用于提供下拉列表选择的组件。其默认状态是可编辑的,这意味着用户不仅可以从列表中选择一个项,还可以输入一个新值。因此,选项2:“组合框的缺省是可编辑的。”是正确的。 ###...

    JavaSwing 图形界面开发与案例详解源文件

    1. **组件使用**:Swing 包含了各种组件,如 JButton(按钮)、JLabel(标签)、JTextField(文本字段)、JTextArea(文本区域)、JComboBox(组合框)等。通过这些源代码,读者可以学习如何创建、配置和布局这些...

Global site tag (gtag.js) - Google Analytics