2017-01-09 1 views
0

Mon application java swing a un JTextFied. Je suis usind une sous-classe de PlainDocument pour la manipulation d'entrée.Java Swing - Comment positionner le curseur à l'intérieur de JTextField à partir de PlainDocument

public class MaskDecimalDocument extends PlainDocument { 

    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { 

     //manipulation input code 

     super.insertString(0, manipulatedText, a); 

    } 

} 

L'utilisateur insère un caractère, la méthode insertString gère le caractère et l'insère dans le texte. Suivant la manipulation, le curseur est positionné à la fin du texte. Comment positionner le curseur à l'endroit d'origine?

Répondre

1

Vous pouvez envisager d'utiliser un DocumentFilter puisqu'il s'agit de l'API la plus récente pour gérer les modifications apportées à un Document. Le concept est le même mais la classe est plus réutilisable puisqu'elle peut être ajoutée à n'importe quel Document.

Lisez la section du tutoriel Swing sur Implementing a DocumentFilter pour plus d'informations.

Comment placer le curseur à l'emplacement d'origine?

Lorsque vous créez votre classe personnalisée DocumentFilter vous devez passer dans le champ de texte qui utilise le Document comme paramètre et enregistrez ce champ de texte comme une variable d'instance de votre classe.

Puis la logique dans la méthode replaceSelection(...) serait quelque chose comme:

int caretPosition = textField.getCaretPosition(); 
super.replaceSelection(...); 
textField.setCaretPosition(caretPosition); 

Notez que vous devrez peut-être placer la méthode setCaretPosition(...) dans un SwingUtilities.invokeLater() pour vous assurer que le code est exécuté après le traitement par défaut pour le réglage du caret position.

1

Le contrôle de la position du curseur n'est pas un travail de Document. Vous devez set a NavigationFilter qui ignore toutes les modifications de la position du curseur:

textField.setNavigationFilter(new NavigationFilter() { 
    @Override 
    public void setDot(FilterBypass bypass, 
         int position, 
         Position.Bias bias) { 
     // Deliberately empty 
    } 

    @Override 
    public void moveDot(FilterBypass bypass, 
         int position, 
         Position.Bias bias) { 
     // Deliberately empty 
    } 

    @Override 
    public int getNextVisualPositionFrom(JTextComponent component, 
             int position, 
             Position.Bias bias, 
             int direction, 
             Position.Bias[] newBias) { 
     return position; 
    } 
});