2016-06-14 9 views
-1

Ich möchte Auto-Vervollständigung von Jtextfield durchführen, zu diesem Zweck google ich und fand einige gute Beispiele und Code-Schnipsel, aber mein Szenario unterscheidet sich von all diesen, normalerweise jedes Beispiel Auto-Vervollständigung des Feldes wenn ich S es mit auto-complete wird Stackoverflow drücken, zum Beispiel sagen, oder wenn ich drücken G wird es google usw. abgeschlossen haben, bedeutet, seine Notwendigkeit nur erste Zeichen für auto-Vervollständigung.Autocomplete jtextfield von bestimmter Länge

Aber mein Problem ist folgendes, ich will Auto-Vervollständigung auszuführen, wenn ersten 4 Zeichen eingegeben wird oder eingegeben sagen, wenn ich stac getippt, als es die automatische Vervollständigung es Stackoverflow sollte, nicht mit dem ersten Zeichen S.

Bitte führen Sie mich, wie werde ich das tun, ich bin fest auf dieses Problem stecken.

folgenden Code verwende ich für meine Arbeiterklasse

package testautocomp; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 

public class JTextFieldAutoCompletion extends JTextField implements DocumentListener, ActionListener{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 4810213451949301347L; 

    //Les Données De L'AutoCompletion 
    private List<String> data = new ArrayList<String>(); 

    //Un Constructeur Par Défaut 
    public JTextFieldAutoCompletion() { 
     //Par Defaut Le Nombre de caractère visible dans le champs de texte est 25 
     this(25); 
    } 
    /** 
    * Un Constructeur Paramétré 
    * @param columns nombre de caractère visible dans le champs de texte 
    */ 
    public JTextFieldAutoCompletion(int columns) { 
     //passer au constructeur à deux arguments le nombre de colonne visible dans le champs de texte et definir les données de l'autocompletion à null. 
     this(columns, null); 
    } 
    /** 
    * Constructeur Paramétré à deux arguments 
    * @param columns nombre de caractère visible dans le champs de texte 
    * @param data les données de l'autocompletion 
    */ 
    public JTextFieldAutoCompletion(int columns, List<String> data) { 
     super(columns); 
     //ici on fait appel à la méthode setDataCompletion pour definir les données de l'autocompletion 
     this.setDataCompletion(data); 
     //je défini l'ecouteur de l'evenement de la saisie 
     this.getDocument().addDocumentListener(this); 
     //je défini j'ecouteur de la touche entrer 
     this.addActionListener(this); 
    } 
    /** 
    * Permet De Redefinir les données de l'autocompletion 
    * @param data les données de l'autocompletion 
    */ 
    public void setDataCompletion(List<String> data) { 
     //on affecte seulement si data est déffirent à null 
     if(data != null) 
      this.data = data; 
     //on va trier les données de l'autocompletion 
     Collections.sort(this.data); 
    } 
    /** 
    * Evenement Déclenché à chaque fois que l'utilisateur tape un caractère quelconque, ou fasse une copier/coller dans le champs de texte. 
    */ 
    @Override 
    public void insertUpdate(DocumentEvent e) { 
     // TODO Stub de la méthode généré automatiquement 
     //on arréte l'exécution de l'evenement si l'utilisateur fasse une copier/coller 
     if(e.getLength() != 1) return; 

     //on récupére la position du dernier caratère saisie en comptant de zéro, premier caractère est en position 0, le deuxième à 2 etc.. 
     int pos = e.getOffset(); 
     String prefix = null; 
     try { 
      //on recupére dans prefix ce qu'a saisi l'utilisateur jusqu'à présent. 
      prefix = this.getText(0, pos + 1); 
     } catch (BadLocationException e1) {} 

     //on fait une recherche sur la chaine qu'a saisi l'utilisateur dans les données de l'autocompletion. 
     //la méthode binarySearch retourne : 
     //Soit l'index de l'element cherché s'il est contenu dans la collection. 
     //Soit le nombre d'element de la collection si tous les elements sont inférieurs à l'element qu'on cherche. 
     //Soit un entier négatif qui représente l'index de premier element supérieur de l'element qu'on cherche. 
     int index = Collections.binarySearch(data, prefix); 

     if(index < 0 && -index <= data.size()) { 
      //Completion Trouvé 
      //On récupére le premier element supérieur à l'element cherché. le signe - retourne la valeur absolue de la variable index. 
      String match = data.get(-index - 1); 

      //on s'assure que la chaine dans la variable match commence par la chaine contenu dans la variable prefix c-à-d ce qu'a saisi l'utilisateur 
      if(match.startsWith(prefix)) { 
       //si oui on met on place l'autocompletion sinon on fait rien :). 
       SwingUtilities.invokeLater(new AutoCompletion(pos, match)); 
      } 
     } else ; 
      //Aucune Completion Trouvé 

    } 
    /** 
    * Permet De Valider L'AutoCompletion En Cliquant Sur La Touche Entrer 
    */ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Stub de la méthode généré automatiquement 
     setCaretPosition(getSelectionEnd()); 
    } 
    @Override 
    public void removeUpdate(DocumentEvent e) {} 
    @Override 
    public void changedUpdate(DocumentEvent e) {} 

    private class AutoCompletion implements Runnable{ 
     private int pos; 
     private String completion; 

     public AutoCompletion(int pos, String completion) { 
      this.pos = pos; 
      this.completion = completion; 
     } 
     @Override 
     public void run() { 
      // TODO Stub de la méthode généré automatiquement 
      //On affecte la chaine trouvé pour l'autocompletion dans le champs de texte 
      setText(completion); 
      //on definit à partir d'où va débuter la séléction des caractères ajouté comme completion. 
      //j'ai précisé qu'il va débuter de la fin vers le dernier caractère sasie par l'utilisateur 
      setCaretPosition(completion.length()); 
      //j'ai appliqué la séléction jusqu'au dernier caractère sasie par l'utilisateur 
      moveCaretPosition(pos + 1); 
     }  
    } 
} 

und hier ist meine Hauptklasse

package testautocomp; 

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 

public class TestAutoComp { 
    public static void main(String[] a) { 
     JFrame f = new JFrame(); 
     JTextFieldAutoCompletion tf = new JTextFieldAutoCompletion(25); 

     List<String> data = new ArrayList<String>(); 
     data.add("jtextfield autocompletion"); 
     data.add("java swing"); 
     data.add("je veux apprendre java"); 
     data.add("stackoverflow"); 
     data.add("ahad");  


     tf.setDataCompletion(data); 
     f.getContentPane().add(tf, "North"); 

     f.pack();f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

(1-) 'ich es Google und einige gute examples' gefunden - so dann die Beispiele ändern, um Ihre Anforderungen zu erfüllen. Sie können einfach die Anzahl der Zeichen überprüfen, die derzeit in das Textfeld eingegeben werden. – camickr

+0

@ (1-) Ich poste meinen Code oben, bitte helfen Sie mir dabei. – ahad

+0

Ich habe Hilfe gegeben. Sie überprüfen die Länge des Textes im Textfeld. Wenn die Länge ist, was Sie wollen, führen Sie Ihre Verarbeitung aus, andernfalls beenden Sie einfach die Methode. – camickr

Antwort

0

Nach Ihrer Frage, die Sie wollen automatische Vervollständigung auszuführen, wenn ersten 4 Zeichen wird eingegeben, Dann geben Sie einfach Ihre insertUpdate() -Methode ein, die Länge des Textes im Textfeld ist größer als 3, also erhalten Sie die erwartete Ausgabe. Ich habe Ihren Code für das erwartete Ergebnis geändert.

package temp; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 

public class JTextFieldAutoCompletion extends JTextField implements DocumentListener, ActionListener{ 

/** 
* 
*/ 
private static final long serialVersionUID = 4810213451949301347L; 

//Les Données De L'AutoCompletion 
private List<String> data = new ArrayList<String>(); 

//Un Constructeur Par Défaut 
public JTextFieldAutoCompletion() { 
    //Par Defaut Le Nombre de caractère visible dans le champs de texte est 25 
    this(25); 
} 
/** 
* Un Constructeur Paramétré 
* @param columns nombre de caractère visible dans le champs de texte 
*/ 
public JTextFieldAutoCompletion(int columns) { 
    //passer au constructeur à deux arguments le nombre de colonne visible dans le champs de texte et definir les données de l'autocompletion à null. 
    this(columns, null); 
} 
/** 
* Constructeur Paramétré à deux arguments 
* @param columns nombre de caractère visible dans le champs de texte 
* @param data les données de l'autocompletion 
*/ 
public JTextFieldAutoCompletion(int columns, List<String> data) { 
    super(columns); 
    //ici on fait appel à la méthode setDataCompletion pour definir les données de l'autocompletion 
    this.setDataCompletion(data); 
    //je défini l'ecouteur de l'evenement de la saisie 
    this.getDocument().addDocumentListener(this); 
    //je défini j'ecouteur de la touche entrer 
    this.addActionListener(this); 
} 
/** 
* Permet De Redefinir les données de l'autocompletion 
* @param data les données de l'autocompletion 
*/ 
public void setDataCompletion(List<String> data) { 
    //on affecte seulement si data est déffirent à null 
    if(data != null) 
     this.data = data; 
    //on va trier les données de l'autocompletion 
    Collections.sort(this.data); 
} 
/** 
* Evenement Déclenché à chaque fois que l'utilisateur tape un caractère quelconque, ou fasse une copier/coller dans le champs de texte. 
*/ 
@Override 
public void insertUpdate(DocumentEvent e) { 
    // TODO Stub de la méthode généré automatiquement 
    //on arréte l'exécution de l'evenement si l'utilisateur fasse une copier/coller 

    if(this.getText().length()>3){ 
    if(e.getLength() != 1) return; 

    //on récupére la position du dernier caratère saisie en comptant de zéro, premier caractère est en position 0, le deuxième à 2 etc.. 
    int pos = e.getOffset(); 
    String prefix = null; 
    try { 
     //on recupére dans prefix ce qu'a saisi l'utilisateur jusqu'à présent. 
     prefix = this.getText(0, pos + 1); 
    } catch (BadLocationException e1) {} 

    //on fait une recherche sur la chaine qu'a saisi l'utilisateur dans les données de l'autocompletion. 
    //la méthode binarySearch retourne : 
    //Soit l'index de l'element cherché s'il est contenu dans la collection. 
    //Soit le nombre d'element de la collection si tous les elements sont inférieurs à l'element qu'on cherche. 
    //Soit un entier négatif qui représente l'index de premier element supérieur de l'element qu'on cherche. 
    int index = Collections.binarySearch(data, prefix); 

    if(index < 0 && -index <= data.size()) { 
     //Completion Trouvé 
     //On récupére le premier element supérieur à l'element cherché. le signe - retourne la valeur absolue de la variable index. 
     String match = data.get(-index - 1); 

     //on s'assure que la chaine dans la variable match commence par la chaine contenu dans la variable prefix c-à-d ce qu'a saisi l'utilisateur 
     if(match.startsWith(prefix)) { 
      //si oui on met on place l'autocompletion sinon on fait rien :). 
      SwingUtilities.invokeLater(new AutoCompletion(pos, match)); 
     } 
    } else ; 
     //Aucune Completion Trouvé 
    } 
} 
/** 
* Permet De Valider L'AutoCompletion En Cliquant Sur La Touche Entrer 
*/ 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Stub de la méthode généré automatiquement 
    setCaretPosition(getSelectionEnd()); 
} 
@Override 
public void removeUpdate(DocumentEvent e) {} 
@Override 
public void changedUpdate(DocumentEvent e) {} 

private class AutoCompletion implements Runnable{ 
    private int pos; 
    private String completion; 

    public AutoCompletion(int pos, String completion) { 
     this.pos = pos; 
     this.completion = completion; 
    } 
    @Override 
    public void run() { 
     // TODO Stub de la méthode généré automatiquement 
     //On affecte la chaine trouvé pour l'autocompletion dans le champs de texte 
     setText(completion); 
     //on definit à partir d'où va débuter la séléction des caractères ajouté comme completion. 
     //j'ai précisé qu'il va débuter de la fin vers le dernier caractère sasie par l'utilisateur 
     setCaretPosition(completion.length()); 
     //j'ai appliqué la séléction jusqu'au dernier caractère sasie par l'utilisateur 
     moveCaretPosition(pos + 1); 
    }  
} 

}