首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-24 
Swing中可多选下拉框的简单实现实现可多选下拉框需要写三个类:MyComboBox.java --- 继承自JComboBoxCheckL

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

实现可多选下拉框需要写三个类:    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等。 
1 楼 yuyeyouyu 2011-12-05   请问,这个控件的选择事件如何实现?

热点排行