public class testJComboBox { public static void main(String[] args) { String str[][] = new String[10][3]; for(int i=0;i<str.length;i++) { str[i][0]=i+6+""; } javax.swing.JComboBox jComboBox = new RwJComboBox(str); jComboBox.setEditable(true); jComboBox.setPreferredSize(new java.awt.Dimension(400,60)); javax.swing.JTextField jTextField = new javax.swing.JTextField(40); //测试焦点事件 javax.swing.JFrame frame = new javax.swing.JFrame(); frame.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 20, 20)); frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); frame.setLocationRelativeTo(null); frame.add(jComboBox); frame.add(jTextField); frame.setVisible(true); } public static class RwJComboBox extends javax.swing.JComboBox implements java.awt.event.FocusListener { protected java.util.Set set = new java.util.HashSet(); public RwJComboBox(String str[][]) { setModel(new RwDefaultComboBoxModel(str)); setUI(new RwMetalComboBoxUI(this)); setRenderer(new RwJCheckBox()); setSelectedIndex(-1); // ((javax.swing.JTextField)getEditor().getEditorComponent()).setEditable(false); // 禁止编辑的代码 } public void focusGained( java.awt.event.FocusEvent e) { } public void focusLost( java.awt.event.FocusEvent e) { // 这是一种特殊情况下的使用方法 // java.awt.Container container=(java.awt.Container)getEditor().getEditorComponent(); // while(container!=null&&!(container instanceof javax.swing.JLabel)) // { // container=container.getParent(); // } // ((cLabel)container).setValue(((javax.swing.JTextField)getEditor().getEditorComponent()).getText()); } } public static class RwMetalComboBoxUI extends javax.swing.plaf.metal.MetalComboBoxUI { private RwMetalComboBoxUI(RwJComboBox rwJComboBox) { this.comboBox=rwJComboBox; } protected javax.swing.plaf.basic.ComboPopup createPopup() { return new RwBasicComboPopup(comboBox); } } public static class RwBasicComboPopup extends javax.swing.plaf.basic.BasicComboPopup { public RwBasicComboPopup(javax.swing.JComboBox combo) { super(combo); } protected void configureList() { super.configureList(); list.setSelectionModel(new RwDefaultListSelectionModel(comboBox)); } protected java.awt.event.MouseListener createListMouseListener() { return new RwMouseAdapter(list,comboBox); } } private static class RwDefaultListSelectionModel extends javax.swing.DefaultListSelectionModel { protected RwJComboBox rwJComboBox; public RwDefaultListSelectionModel(javax.swing.JComboBox comboBox) { this.rwJComboBox=(RwJComboBox) comboBox; } public boolean isSelectedIndex(int index) { return rwJComboBox.set.contains(index); } } private static class RwMouseAdapter extends java.awt.event.MouseAdapter { protected javax.swing.JList list; protected RwJComboBox rwJComboBox; private RwMouseAdapter(javax.swing.JList list, javax.swing.JComboBox comboBox) { this.list=list; this.rwJComboBox=(RwJComboBox) comboBox; } public void mousePressed(java.awt.event.MouseEvent anEvent) { StringBuilder sb,sb1,sb2 ,sb3; int k,index; index = list.getSelectedIndex(); javax.swing.JTextField jTextField=(javax.swing.JTextField)rwJComboBox.getEditor().getEditorComponent(); sb = new StringBuilder(jTextField.getText()); if(sb.length()>0&&','!=sb.charAt(0)) sb.insert(0, ","); if(sb.length()>0&&','!=sb.charAt(sb.length()-1)) sb.append(","); if(sb.length()>0&&",".equals(sb.toString())) sb = new StringBuilder(); if (list.getSelectionMode() == javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) { if (rwJComboBox.set.contains(index)) { rwJComboBox.set.remove(index); sb1 = new StringBuilder(); sb1.append(",").append(rwJComboBox.getModel().getElementAt( index)).append(","); k=sb.indexOf(sb1.toString()); while(k!=-1) { sb.replace(k, k+sb1.length(), ","); k=sb.indexOf(sb1.toString()); } } else { rwJComboBox.set.add(index); if(sb.length()==0) sb.append(",").append(rwJComboBox.getModel().getElementAt( index)).append(","); else sb.append(rwJComboBox.getModel().getElementAt( index)).append(","); } } else { if (!rwJComboBox.set.contains(index)) { rwJComboBox.set.clear(); rwJComboBox.set.add(index); } } Object obj; sb2 =new StringBuilder(sb); //替换完正常的可选值 for(int i=0;i<list.getModel().getSize();i++) { obj=list.getModel().getElementAt(i); sb1 = new StringBuilder(); sb1.append(",").append(obj).append(","); k=sb2.indexOf(sb1.toString()); while(k!=-1) { sb2.replace(k, k+sb1.length(), ","); k=sb2.indexOf(sb1.toString()); } } java.util.List list1 = new java.util.ArrayList(rwJComboBox.set); java.util.Collections.sort(list1); for (int i=0;i<list1.size();i++) { obj = rwJComboBox.getModel().getElementAt( Integer.parseInt(list1.get(i).toString())); sb1 = new StringBuilder(); sb1.append(",").append(obj).append(","); k=sb.indexOf(sb1.toString()); if(k!=-1&&sb2.indexOf(sb1.toString())==-1) { sb2.append(obj).append(","); } } sb = new StringBuilder(sb2); if(sb.length()>0&&','==sb.charAt(0)) sb.deleteCharAt(0); if(sb.length()>0&&','==sb.charAt(sb.length()-1)) sb.deleteCharAt(sb.length()-1); if(sb.length()>0&&",".equals(sb.toString())) sb = new StringBuilder(); jTextField.setText(sb.toString()); // java.awt.Container container =jTextField; // while(container!=null&&!(container instanceof javax.swing.JLabel)) // { // container=container.getParent(); // } // ((cLabel)container).setValue(sb.toString()); rwJComboBox.repaint(); list.repaint(); } } public static class RwDefaultComboBoxModel extends javax.swing.DefaultComboBoxModel { private RwDefaultComboBoxModel(String[][] str) { for(int i=0;i<str.length;i++) addElement(str[i][0]); } } public static class RwJCheckBox extends javax.swing.JCheckBox implements javax.swing.ListCellRenderer { public java.awt.Component getListCellRendererComponent(javax.swing.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()); } setEnabled(list.isEnabled()); setSelected(isSelected); setText(value == null ? "" : value.toString()); setFont(list.getFont()); return this; } } }
java swing的可输入可多选的下拉框
原创
©著作权归作者所有:来自51CTO博客作者lxpandsq的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:win2012图形和核心版切换

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章