Нужно сделать автодополнение текста вводимого в JTextField или editable JComboBox (но необязательно, можно и любой другой компонент). Нашел пример: Java2sAutoComboBox: Код | import java.awt.event.ItemEvent; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.plaf.basic.BasicComboBoxEditor;
public class Java2sAutoComboBox extends JComboBox { private class AutoTextFieldEditor extends BasicComboBoxEditor {
private Java2sAutoTextField getAutoTextFieldEditor() { return (Java2sAutoTextField) editor; }
AutoTextFieldEditor(java.util.List list) { editor = new Java2sAutoTextField(list, Java2sAutoComboBox.this); } }
public Java2sAutoComboBox(java.util.List list) { isFired = false; autoTextFieldEditor = new AutoTextFieldEditor(list); setEditable(true); setModel(new DefaultComboBoxModel(list.toArray()) {
protected void fireContentsChanged(Object obj, int i, int j) { if (!isFired) super.fireContentsChanged(obj, i, j); }
}); setEditor(autoTextFieldEditor); }
public boolean isCaseSensitive() { return autoTextFieldEditor.getAutoTextFieldEditor().isCaseSensitive(); }
public void setCaseSensitive(boolean flag) { autoTextFieldEditor.getAutoTextFieldEditor().setCaseSensitive(flag); }
public boolean isStrict() { return autoTextFieldEditor.getAutoTextFieldEditor().isStrict(); }
public void setStrict(boolean flag) { autoTextFieldEditor.getAutoTextFieldEditor().setStrict(flag); }
public java.util.List getDataList() { return autoTextFieldEditor.getAutoTextFieldEditor().getDataList(); }
public void setDataList(java.util.List list) { autoTextFieldEditor.getAutoTextFieldEditor().setDataList(list); setModel(new DefaultComboBoxModel(list.toArray())); }
void setSelectedValue(Object obj) { if (isFired) { return; } else { isFired = true; setSelectedItem(obj); fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder, 1)); isFired = false; return; } }
protected void fireActionEvent() { if (!isFired) super.fireActionEvent(); }
private AutoTextFieldEditor autoTextFieldEditor;
private boolean isFired;
}
|
Java2sAutoTextField: Код | import java.util.List; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxEditor; import javax.swing.text.*;
public class Java2sAutoTextField extends JTextField { class AutoDocument extends PlainDocument {
public void replace(int i, int j, String s, AttributeSet attributeset) throws BadLocationException { super.remove(i, j); insertString(i, s, attributeset); }
public void insertString(int i, String s, AttributeSet attributeset) throws BadLocationException { if (s == null || "".equals(s)) return; String s1 = getText(0, i); String s2 = getMatch(s1 + s); int j = (i + s.length()) - 1; if (isStrict && s2 == null) { s2 = getMatch(s1); j--; } else if (!isStrict && s2 == null) { super.insertString(i, s, attributeset); return; } if (autoComboBox != null && s2 != null) autoComboBox.setSelectedValue(s2); super.remove(0, getLength()); super.insertString(0, s2, attributeset); setSelectionStart(j + 1); setSelectionEnd(getLength()); }
public void remove(int i, int j) throws BadLocationException { int k = getSelectionStart(); if (k > 0) k--; String s = getMatch(getText(0, k)); if (!isStrict && s == null) { super.remove(i, j); } else { super.remove(0, getLength()); super.insertString(0, s, null); } if (autoComboBox != null && s != null) autoComboBox.setSelectedValue(s); try { setSelectionStart(k); setSelectionEnd(getLength()); } catch (Exception exception) { } }
}
public Java2sAutoTextField(List list) { isCaseSensitive = false; isStrict = true; autoComboBox = null; if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; init(); return; } }
Java2sAutoTextField(List list, Java2sAutoComboBox b) { isCaseSensitive = false; isStrict = true; autoComboBox = null; if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; autoComboBox = b; init(); return; } }
private void init() { setDocument(new AutoDocument()); if (isStrict && dataList.size() > 0) setText(dataList.get(0).toString()); }
private String getMatch(String s) { for (int i = 0; i < dataList.size(); i++) { String s1 = dataList.get(i).toString(); if (s1 != null) { if (!isCaseSensitive && s1.toLowerCase().startsWith(s.toLowerCase())) return s1; if (isCaseSensitive && s1.startsWith(s)) return s1; } }
return null; }
public void replaceSelection(String s) { AutoDocument _lb = (AutoDocument) getDocument(); if (_lb != null) try { int i = Math.min(getCaret().getDot(), getCaret().getMark()); int j = Math.max(getCaret().getDot(), getCaret().getMark()); _lb.replace(i, j - i, s, null); } catch (Exception exception) { } }
public boolean isCaseSensitive() { return isCaseSensitive; }
public void setCaseSensitive(boolean flag) { isCaseSensitive = flag; }
public boolean isStrict() { return isStrict; }
public void setStrict(boolean flag) { isStrict = flag; }
public List getDataList() { return dataList; }
public void setDataList(List list) { if (list == null) { throw new IllegalArgumentException("values can not be null"); } else { dataList = list; return; } }
private List dataList;
private boolean isCaseSensitive;
private boolean isStrict;
private Java2sAutoComboBox autoComboBox; }
|
Main: Код | import javax.swing.*; import java.util.List; import java.util.ArrayList; import java.awt.*;
public class Main extends JFrame { public Main() { setLayout(new FlowLayout());
List list = new ArrayList<String>(); list.add("111111111"); list.add("22222"); list.add("333333333"); list.add("4444444444"); list.add("55555555"); list.add("555332");
Java2sAutoComboBox autoComboBox = new Java2sAutoComboBox(list); add(autoComboBox);
Java2sAutoTextField autoTextField = new Java2sAutoTextField(list); add(autoTextField);
pack(); setVisible(true); }
public static void main(String[] args) { new Main(); } }
|
Но есть один недостаток: пользователь должен сам ввести строку целиком. Мне надо чтобы работало наподобие Ctrl+Spase в java IDE (Eclipse, IDEA).
--------------------
Человек просто обязан ошибаться, раз другие учатся на его ошибках. [color=skyblue]Хочу сменить ник и сменю как только дадут такую возможность.[/color]
|