先上圖:
代碼如下:
package com.java.swing.table;
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;
}
}
}