|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
[Java]completamento automatico su textfield
...ciao...
...come da titolo...come si imposta il completamento automatico su una text field che pesca i propri valori da una tabella db?...avete esperienze in merito?... ...ciao Andrea... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Un programmatore non imposta, realizza!
![]() Completamento automatico 101 Prendi il Document del campo di testo, quando il contenuto cambia consideri come iniziale del testo la porzione che va da 0 a getCaretPosition(). Fai la ricerca nel database, trovi la migliore corrispondenza, imposti come testo attuale la corrispondenza e selezioni (setSelectionStart, setSelectionEnd) la porzione di testo da getCaretPosition() a getLength(). Et voilà.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
ally, devi solo risolvere questo:
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Su un Athlon XP3200 con un dizionario di 704938 parole interamente caricato in memoria (circa 50 megabyte) una semplice scansione lineare con un "word.startsWith(prefisso)" richiede circa 2 centesimi di secondo nel caso peggiore. Considerando che le performace di un homo-digitans medio si attestano sui 2 o 3 caratteri al secondo non risulterebbero problemi di "lag" nell'interazione utente.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
[OT]
Questa me la segno!!!! PS: perchè (non solo in questo 3d) mi trovo sempre d'accordo con te?? [/OT]
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Jan 2003
Città:
Messaggi: 4421
|
...ecco la soluzione al mio cruccio...se mai dovesse servire a qualcuno...presa e legerissimamente modificata da java2s...
Codice:
public class AutoTextField 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 (AutoTextField.this.isStrict && s2 == null) { s2 = getMatch(s1); j--; } else if (!AutoTextField.this.isStrict && s2 == null) { super.insertString(i, s, attributeset); return; } if (AutoTextField.this.autoComboBox != null && s2 != null) AutoTextField.this.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 (!AutoTextField.this.isStrict && s == null) { super.remove(i, j); } else { super.remove(0, getLength()); super.insertString(0, s, null); } if (AutoTextField.this.autoComboBox != null && s != null) AutoTextField.this.autoComboBox.setSelectedValue(s); try { setSelectionStart(k); setSelectionEnd(getLength()); } catch (Exception exception) { // } } } public AutoTextField(List list) { this.isCaseSensitive = false; this.isStrict = true; this.autoComboBox = null; if (list == null) throw new IllegalArgumentException("values can not be null"); this.dataList = list; init(); return; } AutoTextField(List list, AutoComboBox b) { this.isCaseSensitive = false; this.isStrict = true; this.autoComboBox = null; if (list == null) throw new IllegalArgumentException("values can not be null"); this.dataList = list; this.autoComboBox = b; init(); return; } private void init() { setDocument(new AutoDocument()); if (this.isStrict && this.dataList.size() > 0) setText(this.dataList.get(0).toString()); } String getMatch(String s) { for (int i = 0; i < this.dataList.size(); i++) { String s1 = this.dataList.get(i).toString(); if (s1 != null) { if (!this.isCaseSensitive && s1.toLowerCase().startsWith(s.toLowerCase())) return s1; if (this.isCaseSensitive && s1.startsWith(s)) return s1; } } return s; } 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) { System.out.println(exception); } } public boolean isCaseSensitive() { return this.isCaseSensitive; } public void setCaseSensitive(boolean flag) { this.isCaseSensitive = flag; } public boolean isStrict() { return this.isStrict; } public void setStrict(boolean flag) { this.isStrict = flag; } public List getDataList() { return this.dataList; } public void setDataList(List list) { if (list == null) throw new IllegalArgumentException("values can not be null"); this.dataList = list; init(); return; } private List dataList; private boolean isCaseSensitive; boolean isStrict; AutoComboBox autoComboBox; } Codice:
public class AutoComboBox extends JComboBox { private class AutoTextFieldEditor extends BasicComboBoxEditor { private AutoTextField getAutoTextFieldEditor() { return (AutoTextField) this.editor; } AutoTextFieldEditor(java.util.List list) { this.editor = new AutoTextField(list, AutoComboBox.this); } } public AutoComboBox(java.util.List list) { this.isFired = false; this.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(AutoComboBox.this.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) { System.out.println("setSelectedValue"); if (AutoComboBox.this.isFired) return; AutoComboBox.this.isFired = true; setSelectedItem(obj); fireItemStateChanged(new ItemEvent(this, 701, AutoComboBox.this.selectedItemReminder, 1)); AutoComboBox.this.isFired = false; return; } protected void fireActionEvent() { System.out.println("fireActionEvent"); if (!AutoComboBox.this.isFired) super.fireActionEvent(); } private AutoTextFieldEditor autoTextFieldEditor; private boolean isFired; } Codice:
String getMatch(String s) { for (int i = 0; i < this.dataList.size(); i++) { String s1 = this.dataList.get(i).toString(); if (s1 != null) { if (!this.isCaseSensitive && s1.toLowerCase().startsWith(s.toLowerCase())) return s1; if (this.isCaseSensitive && s1.startsWith(s)) return s1; } } return s; } ...ciao Andrea... |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Sto provando un pò la soluzione fornita da Andrea/java2s ...
Non riesco a capire se c'è qualche errore o sbaglio qualcosa io... Io vorrei fare in modo che ad ogni lettera digitata, mi compaia una lista di possibili soluzioni: per farlo l'unico modo è chiamare AutoComboBox, ma io vorrei ottenerlo con il textField... Ora ci sono i 2 costruttori AutoTextField(List list) AutoTextField(List list, AutoComboBox b) e teoricamente il secondo dovrebbe essere la soluzione al mio problema, ma praticamente non ottengo alcuna differenza chiamando l'uno o l'altro... Non so se qualcuno ha provato...
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ... ![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:44.