Remplacer valeur JTextField par nouvelle

Fermé
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 - 4 mai 2013 à 14:42
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 5 mai 2013 à 17:22
Bonjour, Alors voilà, ce code limite la saisie dans un JTextField à une simple lettre

mport javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

 
public class JTextFieldLimit extends PlainDocument 
{
 
	private int limit;
 
	public JTextFieldLimit(int limit) 
	{
		this.limit = limit;
	}
 
 
 
	public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException 
	{
		if (str == null)
			return;
 
		if ((getLength() + str.length()) <= limit && Character.isLetter(str.charAt(0))) 
		{
			super.insertString(offset, str, attr);
			
		}
		
	}
} 


Mais j'aimerais aussi que si j'entre une nouvelle lettre, l'ancienne dans le JTextField soit remplacer par la nouvelle.

Hélas, je n'arrive pas à utiliser la methode replace sans faire planté le programme :(

Comment faut-il faire ?



A voir également:

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 mai 2013 à 22:39
Tu devrais faire une petite classe qui hérite de JTextField mais en ajoutant un KeyListener qui va détecter chaque appui sur une touche.
Je généralises dans le cas où ta limite serait n'importe quel entier : avant que la lettre entrée ne soit ajoutée au texte, tu supprimes la dernière lettre du texte avec un substring, comme ça quand la lettre tapée est ajoutée elle remplace la dernière du champ texte et ça fait ce qu'il faut :

Exemple :

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JTextField;

public class JTextFieldLimit extends JTextField
{
    private static final long serialVersionUID = 1;
    
    public JTextFieldLimit(final int limit) 
    {
        if (limit>0)
        {
            addKeyListener(new KeyListener()
            {
                public void keyTyped(KeyEvent e) 
                {
                    String text = getText();
                    if (text.length()>=limit)
                        setText(text.substring(0, limit-1));
                }
                
                public void keyPressed(KeyEvent e) {}
                public void keyReleased(KeyEvent e)    {}            
            });
        }
    }
/*
    public static void main(String[] args)
    {
        javax.swing.JFrame frame = new javax.swing.JFrame();
        JTextField field = new JTextFieldLimit(5);
        frame.add(field);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    }
*/
}
0
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 2
5 mai 2013 à 16:03
Salut, merci pour ta réponse ça fonctionne très bien, quand on ne se soucis pas de quel type de caractère est la touche que l'on presse, mais comment savoir si la touche est une lettre ou pas ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 mai 2013 à 17:22
C'est à cela que sert l'objet "KeyEvent e" en paramètre des 3 méthodes, ça te permet d'avoir le détail de l'évènement (l'appui sur une touche) qui a provoqué l'appel de la méthode.

Par exemple pour tester si le caractère est une lettre tu pourrais faire :

if (Character.isLetter(e.getKeyChar()))

Remarque : la notion de caractères n'a de sens que dans la méthode keyTyped que j'ai utilisé, dans les deux autres méthodes on utilisera plutôt la notion de touche appuyée (ou relâchée) en testant la valeur de e.getKeyCode. Par exemple avant d'obtenir un caractère 'ê' on aura d'abord appuyé puis relâché la touche '^' puis appuyé la touche 'e', alors que pour le caractère 'E' on aura appuyé sur la touche "shift", appuyé sur la touche 'e' et ensuite relâchées les touches 'e' et 'shift'.
Pour certains traitements il est donc nécessaire d'utiliser les 3 méthodes en parallèle.
0
Balthazar2 Messages postés 138 Date d'inscription mardi 16 octobre 2012 Statut Membre Dernière intervention 29 janvier 2016 2
Modifié par Balthazar2 le 5/05/2013 à 18:07
J'ai réussi en combinant les 2 classes :)

Celle qui hérite de plainDocument qui insert seulement si c'est une lettre

Celle qui hérite de JTextField qui s'occupe de fixer la limite et de remplacer si j'appuie sur une autre lettre
0