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;
}
}
}
转载于:https://blog.51cto.com/lxpandyxl/2129306