java Swing 的下拉框JComboBox可編輯可多選示例

先上圖:

 

代碼如下:

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;
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章