|
|
package com.connor.zf.util;
|
|
|
|
|
|
import java.awt.event.ActionEvent;
|
|
|
import java.awt.event.ActionListener;
|
|
|
import java.awt.event.ItemEvent;
|
|
|
import java.awt.event.ItemListener;
|
|
|
import java.awt.event.KeyEvent;
|
|
|
import java.awt.event.KeyListener;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.Vector;
|
|
|
import javax.swing.ComboBoxModel;
|
|
|
import javax.swing.DefaultComboBoxModel;
|
|
|
import javax.swing.JComboBox;
|
|
|
import javax.swing.JFrame;
|
|
|
import javax.swing.JTextField;
|
|
|
import javax.swing.event.DocumentEvent;
|
|
|
import javax.swing.event.DocumentListener;
|
|
|
|
|
|
import org.eclipse.swt.events.ModifyEvent;
|
|
|
import org.eclipse.swt.events.ModifyListener;
|
|
|
import org.eclipse.swt.graphics.Point;
|
|
|
import org.eclipse.swt.widgets.Combo;
|
|
|
|
|
|
public class JAutoCompleteComboBox extends JComboBox {
|
|
|
|
|
|
private AutoCompleter completer;
|
|
|
|
|
|
public JAutoCompleteComboBox() {
|
|
|
super();
|
|
|
addCompleter();
|
|
|
}
|
|
|
|
|
|
public JAutoCompleteComboBox(ComboBoxModel cm) {
|
|
|
super(cm);
|
|
|
addCompleter();
|
|
|
}
|
|
|
|
|
|
public JAutoCompleteComboBox(Object[] items) {
|
|
|
super(items);
|
|
|
addCompleter();
|
|
|
}
|
|
|
|
|
|
public JAutoCompleteComboBox(List v) {
|
|
|
super((Vector) v);
|
|
|
addCompleter();
|
|
|
}
|
|
|
|
|
|
private void addCompleter() {
|
|
|
setEditable(true);
|
|
|
completer = new AutoCompleter(this);
|
|
|
}
|
|
|
|
|
|
public void autoComplete(String str) {
|
|
|
this.completer.autoComplete(str, str.length());
|
|
|
}
|
|
|
|
|
|
public String getText() {
|
|
|
return ((JTextField) getEditor().getEditorComponent()).getText();
|
|
|
}
|
|
|
|
|
|
public void setText(String text) {
|
|
|
((JTextField) getEditor().getEditorComponent()).setText(text);
|
|
|
}
|
|
|
|
|
|
public boolean containsItem(String itemString) {
|
|
|
for (int i = 0; i < this.getModel().getSize(); i++) {
|
|
|
String _item = " " + this.getModel().getElementAt(i);
|
|
|
if (_item.equals(itemString))
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
JFrame frame = new JFrame();
|
|
|
Object[] items = new Object[] { "", "abc ", "aab ", "aba ", "hpp ",
|
|
|
"pp ", "hlp " };
|
|
|
DefaultComboBoxModel model = new DefaultComboBoxModel();
|
|
|
JAutoCompleteComboBox cmb = new JAutoCompleteComboBox();
|
|
|
cmb.addActionListener(new ActionListener() {
|
|
|
|
|
|
@Override
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
// TODO Auto-generated method stub
|
|
|
String actionCommand2 = e.getActionCommand();
|
|
|
System.out.println("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"+actionCommand2);
|
|
|
System.out.println("<22><>ǰѡ<C7B0><D1A1>ֵ1<D6B5><31>"+cmb.getText());
|
|
|
System.out.println("<22><>ǰѡ<C7B0><D1A1>ֵ2<D6B5><32>"+cmb.getSelectedItem().toString());
|
|
|
}
|
|
|
});
|
|
|
cmb.addItem("");
|
|
|
cmb.addItem("<22><>Ʒ");
|
|
|
cmb.addItem("<22><><EFBFBD><EFBFBD>Ʒ");
|
|
|
cmb.addItem("<22><><EFBFBD><EFBFBD>");
|
|
|
cmb.addItem("<22><>");
|
|
|
cmb.addItem("<22><>");
|
|
|
model.addElement("");
|
|
|
model.addElement("abc ");
|
|
|
model.addElement("aab ");
|
|
|
model.addElement("aba ");
|
|
|
model.addElement("hpp ");
|
|
|
model.addElement("pp ");
|
|
|
model.addElement("hlp ");
|
|
|
frame.getContentPane().add(cmb);
|
|
|
frame.setSize(400, 80);
|
|
|
frame.setVisible(true);
|
|
|
// try {
|
|
|
// Thread.sleep(1*1000);
|
|
|
// System.out.println(cmb.getText());
|
|
|
// } catch (InterruptedException e) {
|
|
|
// // TODO Auto-generated catch block
|
|
|
// e.printStackTrace();
|
|
|
// }
|
|
|
}
|
|
|
class AutoCompleter implements KeyListener, ItemListener {
|
|
|
|
|
|
private JComboBox owner = null;
|
|
|
private JTextField editor = null;
|
|
|
private ComboBoxModel model = null;
|
|
|
|
|
|
public AutoCompleter(JComboBox comboBox) {
|
|
|
owner = comboBox;
|
|
|
editor = (JTextField) comboBox.getEditor().getEditorComponent();
|
|
|
editor.addKeyListener(this);
|
|
|
// editor.getDocument().addDocumentListener(new DocumentListener() {
|
|
|
//
|
|
|
// @Override
|
|
|
// public void removeUpdate(DocumentEvent e) {
|
|
|
// System.out.println("ɾ<><C9BE>");
|
|
|
// int caretPosition = editor.getCaretPosition();
|
|
|
// String str = editor.getText();
|
|
|
// autoComplete(str, caretPosition);
|
|
|
// }
|
|
|
//
|
|
|
// @Override
|
|
|
// public void insertUpdate(DocumentEvent e) {
|
|
|
// System.out.println("<22><><EFBFBD><EFBFBD>");
|
|
|
// }
|
|
|
//
|
|
|
// @Override
|
|
|
// public void changedUpdate(DocumentEvent e) {
|
|
|
// System.out.println("<22><EFBFBD>");
|
|
|
// }
|
|
|
// });
|
|
|
model = comboBox.getModel();
|
|
|
|
|
|
owner.addItemListener(this);
|
|
|
}
|
|
|
|
|
|
public void keyTyped(KeyEvent e) {
|
|
|
}
|
|
|
|
|
|
public void keyPressed(KeyEvent e) {
|
|
|
}
|
|
|
|
|
|
public void keyReleased(KeyEvent e) {
|
|
|
char ch = e.getKeyChar();
|
|
|
// if (ch == KeyEvent.CHAR_UNDEFINED || Character.isISOControl(ch)
|
|
|
// || ch == KeyEvent.VK_DELETE)
|
|
|
// return;
|
|
|
// System.out.println("str="+str);
|
|
|
// System.out.println("caretPosition="+caretPosition);
|
|
|
// if (str.length() == 0)
|
|
|
// return;
|
|
|
|
|
|
// if(ch == KeyEvent.VK_ENTER) {
|
|
|
// System.out.println("ִ<>м<EFBFBD><D0BC><EFBFBD>");
|
|
|
// int caretPosition = editor.getCaretPosition();
|
|
|
// String str = editor.getText();
|
|
|
// autoComplete(str, caretPosition);
|
|
|
// }
|
|
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
|
|
@Override
|
|
|
public void run() {
|
|
|
// TODO Auto-generated method stub
|
|
|
try {
|
|
|
Thread.sleep(500);
|
|
|
int caretPosition = editor.getCaretPosition();
|
|
|
String str = editor.getText();
|
|
|
autoComplete(str, caretPosition);
|
|
|
} catch (InterruptedException e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}).start();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ɡ<EFBFBD><C9A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>Ŀ.
|
|
|
*/
|
|
|
protected void autoComplete(String strf, int caretPosition) {
|
|
|
System.out.println("<22><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>±꣺"+caretPosition);
|
|
|
Object[] opts;
|
|
|
opts = getMatchingOptions(strf.substring(0, caretPosition));
|
|
|
if (owner != null) {
|
|
|
model = new DefaultComboBoxModel(opts);
|
|
|
owner.setModel(model);
|
|
|
}
|
|
|
if (opts.length > 0) {
|
|
|
String str = opts[0].toString();
|
|
|
try {
|
|
|
|
|
|
editor.setCaretPosition(caretPosition);
|
|
|
}catch (Exception e) {
|
|
|
}
|
|
|
if (owner != null) {
|
|
|
try {
|
|
|
owner.showPopup();
|
|
|
} catch (Exception ex) {
|
|
|
ex.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
* <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>Ŀ, <20><><EFBFBD>ҽ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>档
|
|
|
*
|
|
|
* @param str
|
|
|
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
|
|
*/
|
|
|
protected Object[] getMatchingOptions(String str) {
|
|
|
// System.out.println("str2="+str);
|
|
|
List v = new Vector();
|
|
|
List v1 = new Vector();
|
|
|
if("".equals(str)) {
|
|
|
boolean hasempty = false;
|
|
|
for (int k = 0; k < model.getSize(); k++) {
|
|
|
Object itemObj = model.getElementAt(k);
|
|
|
if (itemObj != null) {
|
|
|
String item = itemObj.toString();
|
|
|
if(!"".equals(item))
|
|
|
item = item.toLowerCase();
|
|
|
if (item.equals(str)) {
|
|
|
hasempty = true;
|
|
|
v.add(model.getElementAt(k));
|
|
|
}else {
|
|
|
v1.add(model.getElementAt(k));
|
|
|
}
|
|
|
} else {
|
|
|
hasempty = true;
|
|
|
v1.add(model.getElementAt(k));
|
|
|
}
|
|
|
}
|
|
|
if(!hasempty) {
|
|
|
v.add("");
|
|
|
}
|
|
|
}else {
|
|
|
|
|
|
for (int k = 0; k < model.getSize(); k++) {
|
|
|
Object itemObj = model.getElementAt(k);
|
|
|
if (itemObj != null) {
|
|
|
String item = itemObj.toString().toLowerCase();
|
|
|
if (item.startsWith(str.toLowerCase()))
|
|
|
v.add(model.getElementAt(k));
|
|
|
else
|
|
|
v1.add(model.getElementAt(k));
|
|
|
} else
|
|
|
v1.add(model.getElementAt(k));
|
|
|
}
|
|
|
}
|
|
|
for (int i = 0; i < v1.size(); i++) {
|
|
|
v.add(v1.get(i));
|
|
|
}
|
|
|
if (v.isEmpty())
|
|
|
v.add(str);
|
|
|
return v.toArray();
|
|
|
}
|
|
|
|
|
|
public void itemStateChanged(ItemEvent event) {
|
|
|
if (event.getStateChange() == ItemEvent.SELECTED) {
|
|
|
int caretPosition = editor.getCaretPosition();
|
|
|
if (caretPosition != -1) {
|
|
|
try {
|
|
|
editor.moveCaretPosition(caretPosition);
|
|
|
} catch (IllegalArgumentException ex) {
|
|
|
ex.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} |