Java 从特定长度自动完成jtextfield

Java 从特定长度自动完成jtextfield,java,swing,swingx,Java,Swing,Swingx,我想执行jtextfield的自动完成,为此我搜索了它并找到了一些好的示例和代码片段,但我的场景与所有这些不同,通常每个示例都自动完成字段,例如,如果我按S它将自动完成Stackoverflow,或者如果我按G它将完成google等,这意味着它只需要第一个字符就可以自动完成 但我的问题是,我想在键入或输入前4个字符时执行自动完成,如果我键入了stac,那么它应该自动完成到stackoverflow,而不是第一个字符 请指导我怎么做我在这个问题上陷入了困境 以下代码是我的工人阶级使用的 packa

我想执行jtextfield的自动完成,为此我搜索了它并找到了一些好的示例和代码片段,但我的场景与所有这些不同,通常每个示例都自动完成字段,例如,如果我按S它将自动完成Stackoverflow,或者如果我按G它将完成google等,这意味着它只需要第一个字符就可以自动完成

但我的问题是,我想在键入或输入前4个字符时执行自动完成,如果我键入了stac,那么它应该自动完成到stackoverflow,而不是第一个字符

请指导我怎么做我在这个问题上陷入了困境

以下代码是我的工人阶级使用的

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);
        }       
    }
}
包测试组件;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
导入javax.swing.text.BadLocationException;
公共类JTextFieldAutoCompletion扩展JTextField实现DocumentListener、ActionListener{
/**
* 
*/
私有静态最终长serialVersionUID=4810213451949301347L;
//自动完成
私有列表数据=新的ArrayList();
联合国组织
公共JTextFieldAutoCompletion(){
//在第25届世界纺织锦标赛上,我们可以看到卡拉奇的名字
这(25);
}
/**
*联合国建筑公司
*@param columns nombre de caractère visible dans le champs de texte
*/
公共JTextFieldAutoCompletion(int列){
//结构的过程是两个参数,一个是可见的,一个是文本和定义的,一个是自动完成的。
此字段(列,空);
}
/**
*构造函数Paramétréa deux参数
*@param columns nombre de caractère visible dans le champs de texte
*@param data les données de l'autocompletion
*/
公共JTextFieldAutoCompletion(int列、列表数据){
超级(列);
//ici在自动完成的定义中设置数据完成
此.setDataCompletion(数据);
//我是塞西岛的和平之家
this.getDocument().addDocumentListener(this);
//这是一个很好的选择
this.addActionListener(this);
}
/**
*重新定义“自动完成”的过程
*@param data les données de l'autocompletion
*/
公共void setDataCompletion(列表数据){
//关于影响元素的数据表示为空
如果(数据!=null)
这个数据=数据;
//论自动补全
Collections.sort(this.data);
}
/**
*晚上,你可以把磁带放在一个柜子上,你可以把它放在一台复印机上。
*/
@凌驾
公共作废插入更新(文档事件e){
//TODO Stub de la méthode généréautomatiquement
//关于使用复印机/抄录机的客户的晚上执行协议
如果(e.getLength()!=1)返回;
//在德尔涅尔克拉赛亚站的赛亚站上,总理克拉赛亚站在第0位,第2位,等等。。
int pos=e.getOffset();
字符串前缀=null;
试一试{
//在recupére dans上,前缀ce qu'a saisi l'USILIATER jusqu'a présent。
prefix=this.getText(0,pos+1);
}捕获(BadLocationException e1){}
//在自动完成的过程中,我们将利用这条链上的信息。
//la méthode binarySearch retourne:
//元素索引是收藏的重要内容。
//因此,集合元素的名称与切切元素的名称相同。
//因此,我们必须报告对切切的主要元素的支持指数。
int index=Collections.binarySearch(数据,前缀);

如果(index<0&&index根据您的问题,您希望在键入前4个字符时执行自动完成,那么只需在insertUpdate()方法中进行检查,文本字段中的文本长度大于3,因此将获得预期的输出。 我已经修改了您的代码以获得预期的结果

 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);
    }       
}
封装温度;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
导入javax.swing.text.BadLocationException;
公共类JTextFieldAutoCompletion扩展JTextField实现DocumentListener、ActionListener{
/**
* 
*/
私有静态最终长serialVersionUID=4810213451949301347L;
//自动完成
私有列表数据=新的ArrayList();
联合国组织
公共JTextFieldAutoCompletion(){
//在第25届世界纺织锦标赛上,我们可以看到卡拉奇的名字
这(25);
}
/**
*联合国建筑公司
*@param columns nombre de caractère visible dans le champs de texte
*/
公共JTextFieldAutoCompletion(int列){
//结构的过程是两个参数,一个是可见的,一个是文本和定义的,一个是自动完成的。
此字段(列,空);
}
/**
*构造函数Paramétréa deux参数
*@param列名称
 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);
    }       
}