`
lzth
  • 浏览: 142773 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Swing中可多选下拉框的简单实现

    博客分类:
  • Java
阅读更多
实现可多选下拉框需要写三个类:
    MyComboBox.java --- 继承自JComboBox
    CheckListCellRenderer.java --- 继承自JCheckBox,且实现ListCellRenderer
    CheckValue.java --- 设置JCheckBox的类
 
此处也是比较简单的实现,具体为以下为代码:


####MyComboBox.java####
 
public class MyComboBox extends JComboBox implements ActionListener {
    public MyComboBox() {
        addItem(new CheckValue(false, "Select All"));
        this.addActionListener(
                new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                itemSelected();
            }
        });
    }

    private void itemSelected() {
        if (getSelectedItem() instanceof CheckValue) {
            if (getSelectedIndex() == 0) {
                selectedAllItem();
            } else {
                CheckValue jcb = (CheckValue) getSelectedItem();
                jcb.bolValue = (!jcb.bolValue);
                setSelectedIndex(getSelectedIndex());
            }
            SwingUtilities.invokeLater(
                    new Runnable() {
                public void run() {
                    /*选中后依然保持当前弹出状态*/
                    showPopup();
                }
            });
        }
    }
    private void selectedAllItem() {
        boolean bl = false;
        for (int i = 0; i < getItemCount(); i++) {
            CheckValue jcb = (CheckValue) getItemAt(i);
            if (i == 0) {
                bl = !jcb.bolValue;
            }
            jcb.bolValue = (bl);
        }
        setSelectedIndex(0);
    }
    /*获取选取的对象*/
    public Vector getComboVc() {
        Vector vc = new Vector();
        for (int i = 1; i < getItemCount(); i++) {
            CheckValue jcb = (CheckValue) getItemAt(i);
            if (jcb.bolValue) {
                vc.add(jcb.value);
            }
        }
        return vc;
    }
}
 
###CheckListCellRenderer.java###
 
public class CheckListCellRenderer extends JCheckBox implements ListCellRenderer,
        Serializable {
    protected static Border noFocusBorder;
    /**
     * Constructs a default renderer object for an item
     * in a list.
     */
    public CheckListCellRenderer() {
        super();
        if (noFocusBorder == null) {
            noFocusBorder = new EmptyBorder(1, 1, 1, 1);
        }
        setOpaque(true);
        setBorder(noFocusBorder);
    }
    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
        setComponentOrientation(list.getComponentOrientation());
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }
        if (value instanceof CheckValue) {
            CheckValue ckValue = (CheckValue) value;
            this.setText(ckValue.value == null ? "" : ckValue.value);
            this.setSelected(ckValue.bolValue);
        }
        setEnabled(list.isEnabled());
        setFont(list.getFont());
        setBorder((cellHasFocus) ?
                  UIManager.getBorder("List.focusCellHighlightBorder") :
                  noFocusBorder);
        return this;
    }
}
 
###CheckValue.java###
 
public class CheckValue {
    public boolean bolValue = false;
    public String value = null;
    public CheckValue() {
    }
    public CheckValue(boolean bolValue, String value) {
        this.bolValue = bolValue;
        this.value = value;
    }
}
 
 
    这三个类放在一个包里,或者简单起见放在一个java文件也可,注意以下inner class和friend class的区别即可。
    使用方法也很简单:
 
        for (int i = 0; i < 10; i++) {
            CheckValue cValue = new CheckValue();
            cValue.value = "测试_" + i;
            if (i % 3 == 0) {
                cValue.bolValue = true;
            }
            jComboBox1.addItem(cValue);
        }
        jComboBox1.setRenderer(new CheckListCellRenderer());
        jComboBox1.setFont(new Font("Dialog", Font.PLAIN, 12));

 

    以上是不完整的测试代码,MyComboBox实现的功能是可以多选List项,且占用空间比较小,比传统的JList控件使用也方便,JList一般都是使用Ctrl或Shift键来多选,使用起来不是那么一目了然,MyComboBox还可以实现全选和全部不选的功能,当然这只是非常简单的实现,可以扩展的地方还很多,可以实现多种颜色Item等。 
  • 大小: 9.4 KB
分享到:
评论
3 楼 眼镜蛇 2014-07-31  
哦,找到了,getComboVc()。开始没细看。不好意思
2 楼 眼镜蛇 2014-07-30  
朋友不知你还能不能看到,这个组件写得非常好。但我想知道,我应该怎么才能得到选中的那几个条目呢?
1 楼 yuyeyouyu 2011-12-05  
请问,这个控件的选择事件如何实现?

相关推荐

    Swing控件,多选下拉框

    创建一个多选下拉框在Swing中需要对组件模型、渲染器和事件处理有深入理解。虽然这可能比创建单选下拉框复杂,但通过自定义或使用第三方库,你可以轻松实现这一功能。对于更复杂的需求,如分组、搜索等功能,可能...

    java swing 多选下拉框 支持动态加载数据

    在Swing中,多选下拉框通常由JComboBox类实现,但默认的JComboBox只支持单选。为了实现多选功能,我们需要扩展JComboBox或者使用第三方库,如JList或JTable与弹出面板组合。 本主题涉及的知识点主要包括以下几个...

    swing带滚动条的多选下拉选择框(name code形式)

    在Java的Swing库中,开发用户界面时经常会遇到需要创建具有滚动条的多选下拉选择框的需求。这样的组件可以提供丰富的交互性,并且在选项较多时,用户可以通过滚动条方便地浏览和选择。标题提到的"swing带滚动条的...

    JComboBox下拉框多选

    在标题"JComboBox下拉框多选"中提到的场景,就是将`JComboBox`与`JCheckBox`相结合,以实现用户可以从下拉列表中选择多个选项的功能。 以下是一个详细的解释: 1. **JComboBox的基本使用**: `JComboBox`是Java ...

    java下拉菜单复选框

    在这个场景中,我们关注的是一个自定义的下拉菜单与复选框功能的实现,这通常用于提供多选选项给用户。这个功能使得用户能够在文本框中通过点击触发一个下拉菜单,然后在菜单中选择多个复选框选项,这些选项会自动...

    phaGUILib.rar

    在Java的Swing库中,开发用户界面时经常会遇到需要创建多选下拉框(Multiple Selection Dropdown)的需求...总的来说,"phaGUILib"提供了一种便捷的方式来实现 Swing 中的多选下拉框,同时增强了其交互性和设计灵活性。

    Jave Swing Tab页签窗体,界面漂亮,毕业设计案例

    在描述中提到的“多选签界面下拉框选择”,这可能是指在某个标签页内集成一个下拉菜单(ComboBox),让用户在多个选项中进行选择。Java Swing 提供了 `javax.swing.JComboBox` 类来实现这一功能。例如: ```java ...

    JAVA题库管理系统,运用数据库知识,下拉框、树、单选框、复选框等控件

    在题库管理系统中,JAVA的Swing或JavaFX库被用来创建图形用户界面(GUI),提供友好的交互体验。下拉框、树、单选框和复选框等控件的使用,是GUI设计中常见的元素,它们能够使用户以直观的方式进行操作。 1. 下拉框...

    java_swing大量的table例子

    在Swing中,`JTable`是一个非常重要的组件,它允许开发者在应用程序中展示二维数据,并且支持多种交互功能,如排序、选择、编辑等。这个压缩包文件"java_swing大量的table例子"显然提供了丰富的`JTable`使用示例,...

    Java-Swing控件实例代码

    压缩包中的“Java-Swing控件实例代码”很可能包含了上述控件的使用示例,通过阅读和运行这些代码,开发者能够更直观地学习Swing控件的用法,掌握如何在实际项目中应用它们。同时,这些示例也可以作为调试和优化GUI...

    java中各种控件使用范例

    Swing 中的事件处理主要通过事件监听器(Listener)实现。如 ActionListener、ItemListener 和 ChangeListener。监听器接口定义了特定的回调方法,当相应的事件发生时,这些方法会被调用。 7. **JFrame** JFrame ...

    用JComboBox和JList实现的一个文件浏览器组件

    在Java Swing中,`JComboBox`和`JList`是两种常用的用户界面组件,用于创建交互式的下拉列表和多选列表。在这个“文件浏览器组件”中,它们被巧妙地结合在一起,为用户提供了一个功能丰富的文件浏览和选择的界面。这...

    comboxTree 控件

    - 对于编程语言如Java、C#或JavaScript,都有对应的库或框架提供ComboxTree实现,例如Java的Swing或JavaFX,C#的WinForms或WPF,JavaScript的jQuery UI等。 6. **应用场景**: - 文件系统浏览:在文件选择对话框...

    带checkbox的Combobox

    实现带Checkbox的Combobox可以使用各种编程语言和库,例如在Java中,我们可以使用Swing库的JComboBox类,并自定义渲染器来显示带有Checkbox的项。在.NET Framework中,可以使用WinForms或WPF,通过自定义控件或者...

    SwingTemplate:swing 控件,常用的,扩展的

    3. **布局管理器**:SwingTemplate可能提供了更为灵活和方便的布局管理器,使得开发者可以更简单地调整窗口中的控件布局。 4. **对话框**:包括警告对话框、确认对话框、输入对话框等,这些对话框可能已经具有了...

    Java实验八-Java综合实验及输入输出流.doc

    - `JCheckBox`和`JRadioButton`实现多选和单选功能。 - `JComboBox`创建下拉框。 - `GridLayout`布局管理器,使组件按网格排列。 - `BorderLayout`布局管理器,将组件分配到五个区域(北、南、东、西、中)。 -...

    (完整word)java必备单词.doc

    45. **implements**: 实现 - 类实现接口,承诺提供接口中定义的所有方法的实现。 46. **exception**: 异常 - 程序运行时发生的错误或异常情况。 47. **Runtime**: 运行时 - 程序正在执行的状态。 48. **...

    hswing-开源

    3. **HLaf (HSwing Look and Feel)**:HLaf 类可能是 HSwing 自定义外观和感觉(LookAndFeel)的实现,允许开发者轻松地定制 Swing 应用程序的视觉样式,以满足特定的品牌或用户需求。 4. **HLafEx**:HLafEx 可能...

Global site tag (gtag.js) - Google Analytics