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); } }
效果如下图:
删除前:
删除后:
相关推荐
* setEditable(boolean flag):设置下拉列表框是否可编辑。 示例代码 以下是一个简单的示例代码,演示如何使用 JComboBox: ```java package com.xiets.swing; import javax.swing.*; import java.awt.event....
总之,`JComboBox` 是 Java GUI 开发中一个重要的组件,用于创建具有下拉菜单功能的选择框。理解和熟练掌握它的用法对于构建交互式应用程序至关重要。通过组合不同的监听器和自定义方法,我们可以实现丰富的用户交互...
- `addItem()`和`removeItem()`方法用于向组合框添加或删除选项。 - `setModel()`方法用于设置组合框的数据模型,可以是`DefaultComboBoxModel`或其他自定义模型。 - `setSelectedItem()`和`getSelectedItem()`...
组合框(ComboBox)通常由两部分组成:一个可编辑的文本框和一个下拉列表。用户可以在文本框中输入文字,或者通过点击下拉箭头来选择列表中的预设选项。这种控件提供了灵活性,既可以允许用户自由输入,也可以限制...
在"Java Swing综合程序"中,我们将深入探讨如何使用Swing组件构建一个功能丰富的用户界面,包括菜单栏(JMenuBar)、工具栏(JPopupMenu)、组合框(JComboBox)、复选框(JCheckBox)和单选按钮(JRadioButton),...
它能够显示一个可编辑的文本字段和一个下拉列表,用户可以在其中选择一个选项或者手动输入文本。`JComboBox`通过其模型(`ComboBoxModel`)来管理其数据源。本文将深入探讨如何利用`JComboBox`实现自动搜寻功能,以...
SWING提供了许多高级组件,如JTextComponent(包括JTextArea和JEditorPane)用于文本编辑,以及JMenu、JMenuItem等用于创建菜单和下拉菜单。这些组件使得我们可以实现剪切、复制、粘贴等基本编辑功能。通过调用...
7. **ItemListener**:这是Java AWT/Swing事件监听器接口,用于监听菜单项或组合框的选择变化。在代码中,当用户更改字体、样式或颜色时,会触发相应的事件处理,更新文本的显示。 8. **Font** 类:Java中的Font类...
7. **可编辑的组合框**: 通过`comboBox.setEditable(true);`设置`JComboBox`为可编辑状态,允许用户不仅从预设选项中选择,还能输入自定义颜色。 综上所述,这个实例展示了如何利用Java Swing组件创建一个实用的...
`ComboBox`的基本结构包括一个可编辑的文本字段和一个下拉列表。在默认情况下,`ComboBox`的大小是固定的,不论其包含多少个items。但是,当items数量过多时,固定大小的下拉框可能会显得过于拥挤或者不协调。因此,...
`JComboBox`则是一个下拉选择框,允许用户从预定义的选项中进行选择。在`JTable`中集成`JComboBox`可以为用户提供更丰富的交互体验,例如在表格的某一列中提供可选的值。 本示例项目“一个简单的JTABLE运用combox的...
这篇博文中,作者详细介绍了多个关键主题,包括但不限于列表、组合框、表格、树形视图、文本处理、拖放功能、透明窗口和动画效果,以及Swing与本地操作系统集成和打包的相关内容。 首先,我们来看看`Ch01-...
- **组合框(JComboBox)**:下拉列表选择项,可编辑或不可编辑。 - **单选按钮(JRadioButton)**:一组中只能选中一个。 - **复选框(JCheckBox)**:可选中多个。 - **列表框(JList)**:列出一组选项供用户...
- 列表框(JList)和组合框(JComboBox):用于选择项列表。 - 菜单(JMenu、JMenuItem):创建下拉菜单和子菜单。 5. 多线程 Java的多线程特性允许程序同时执行多个任务,这对于处理耗时操作或实现并发非常有用...
3. **组合框(JComboBox)**:这是一个下拉列表控件,用于让用户从预设的选项中选择一个值,也可以允许用户自定义输入。可以通过多种方式初始化组合框,例如使用数组、集合或`ComboBoxModel`对象。当用户选择了一个...
JTextField类是Swing中的实现,可以设定最大字符数、是否可编辑等属性。 3. **文本区域(TextArea)**:用于多行文本输入或显示,例如阅读代码或长篇文章。JTextArea类提供了滚动条和行数列数的设置。 4. **下拉菜单...
5. **组合框JComboBox**:下拉列表,允许用户选择一个项。 6. **带滚动窗格的面板JScrollPane**:用于包含大型组件,如`JTextArea`,并提供滚动条。 7. **列表JList**:显示一组可选项目,用户只能选择单个或多个项...
- **MultiComponentTable.java**:此示例展示了如何在一个单元格中组合多个组件(如 JComboBox、JCheckBox 和 JTextField)。 - **MultiComponentTable2.java**:提供了另一个使用多种组件的表格单元格示例。 - **...
组合框(`JComboBox`)是Swing框架中用于提供下拉列表选择的组件。其默认状态是可编辑的,这意味着用户不仅可以从列表中选择一个项,还可以输入一个新值。因此,选项2:“组合框的缺省是可编辑的。”是正确的。 ###...
1. **组件使用**:Swing 包含了各种组件,如 JButton(按钮)、JLabel(标签)、JTextField(文本字段)、JTextArea(文本区域)、JComboBox(组合框)等。通过这些源代码,读者可以学习如何创建、配置和布局这些...