IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JFormattedField et @IP


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut JFormattedField et @IP
    Bonjour, tout le monde,

    Je suis entrain de développer une interface qui nessecite le champ de saisie pour @ IP .
    voici le code que j'ai utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	JFrame f=new JFrame();
    	JPanel p=new JPanel();
     
      MaskFormatter fmt = null;
     
            try {
     
            fmt = new MaskFormatter("###.###.###.###");
     
            } catch (java.text.ParseException e) {
     
            }
            JFormattedTextField tft1 = new JFormattedTextField(fmt);
            p.add(tft1);
            f.getContentPane().add(p);
            f.setVisible(true);

    il ya deux problemes:

    1* taille de champ de saisie est petite?
    2* il sait meme @ 450.345.234.544 or ceci est erronne comment je le filtre pour qu'il ne saisie

    que dans la plage 0 255

    Merci pour votre aide

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 109
    Par défaut
    1* taille de champ de saisie est petite?
    c'est le layout qui gere ca, mets un setPreferredSize sur ton JFormattedTextField ca devrait resoudre le soucis.

    2* il sait meme @ 450.345.234.544 or ceci est erronne comment je le filtre pour qu'il ne saisie
    ca va etre a toi de le gerer, tu peux ajouter un actionListener ou un LostFocusListener ou encore un KeyListener selon le moment ou tu veux verifier la chaine de caractere.
    Et sur un des evenements tu verifis le contenu du JFormattedTextField.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut
    Merci pour votre aide
    pour la premiere question c'est bon mais pour la deuxieme je dois verifie le contenu du JFormattedTextField au moment de saisie alors je dois utilise le KeyListener .
    voici le code que j'ai ajoute mais on reste tj dans le meme probleme

    tft1.addKeyListener(new KeyListener(){

    public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub
    if(arg0.getKeyCode()>255)
    {
    arg0.setKeyChar('\0');
    }
    }

    public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub

    }

    public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

    }});

    Merci

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 109
    Par défaut
    Il ne faut pas tester juste le caractere que la personne tape.
    Mais le texte entier.

    tu recupere les 3 premiers caracteres et tu verifis que ca fait - de 255.
    de meme pour les autres.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut Help
    salut,

    comment je recupere les trois premiers caractere pour faire un test? car .gettext(); ne le permet pas
    Merci

  6. #6
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 109
    Par défaut
    getText(); te renvois un objet de type String

    Et comme tout objet il a des methodes :

    String ip = tft1.getText();
    String premierbloc = ip.subString(0,2);


    pour voir toutes les possibilités regarde ici :
    http://java.sun.com/javase/6/docs/ap...ng/String.html

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut
    c'est vrai que ca marche,
    mais le probleme est au moment de saisie sil y erreur il taffiche @ erronne
    c'est le meme cas de definition d'@Ip pour windows?c'est ca ce qui est demande de l'application,??
    Ta saisie le probleme???
    Merci

  8. #8
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Pour contraindre l'utilisateur à ne taper que des caractères valides, entendre par cela que la frappe d'une touche rendant le format incorrect est ignorée ( exemple : le champ est vide, l'utilisateur commence à taper : seules les touches 0, 1 et 2 sont "actives", pour le deuxième caractère seules les touches 0 à 5 sont "actives" ... ) : Personnellement j'utiliserais la classe DocumentFilter avec le Document du textfield.

  9. #9
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut Help on @ IP with swing
    salut,
    je doit faire un champ qui contient @ip sera schematiser dans une interface developpe en swing voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public static void main(String[] args) {
    JFrame f=new JFrame();
    JPanel p=new JPanel(new BorderLayout());
            MaskFormatter fmt = null;
                 try
                {       
                fmt = new MaskFormatter("###.###.###.###");
                }
                catch (java.text.ParseException e)
                {             }
                tft1= new JFormattedTextField(fmt);
                tft1.setPreferredSize(new Dimension(100,20));
                p.add(tft1);
                f.getContentPane().add(p);
                f.setVisible(true);       
        }
    Mon probleme comment je gere au moment de la saisie que l'utilisateur ne saisie pas des valeurs érroné tels que 432.90.789.0

    merci pour vos aides

  10. #10
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 109
    Par défaut
    tu as posé la même question il y a une semaine...
    cf : http://www.developpez.net/forums/sho...d.php?t=325997

    si tu ne nous ecoutes pas on ne t'aidera plus.

  11. #11
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut
    j'ai essaye les methodes que vous avez mentionne mais j'ai pas resolu le probleme je reste toujours ds le meme cerle
    please help

  12. #12
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Je pencherais plutôt dans ce cas pour l'utilisation d'une regexp et d'un formater perso

    Pour la regexp quelquechose dans ce style pourrait être correct:

    Code regexp : Sélectionner tout - Visualiser dans une fenêtre à part
     \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

    Pour le regexpformatter

    http://www.koders.com/java/fidD94E5F...6B6759D8E.aspx

  13. #13
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut
    Salut, j’ai bien réfléchi au code ceci marche pour le champ textfield mais pour JFormattedTextField non.
    Voici le code de mon test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.regex.*;
    import javax.swing.*;
    import javax.swing.text.MaskFormatter;
     
    public class test_ip  implements ActionListener{
    	JFrame frame;
    	JPanel pane;
    	JTextField txt;
    	JFormattedTextField tft1 ;
    	JButton bt,BT;
    	Pattern IP_PATTERN= Pattern.compile("^((25[0-5]|2[0-4]\\d|1?\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|1?\\d?\\d)$");
    	MaskFormatter fmt = null;
    	String ip,ip1;
    	test_ip()
    	{ 
    		frame  = new JFrame();
    		frame.setSize(200,100);
    		pane   =new JPanel();
    		//test n°1
    		txt    =new JTextField(10);
    		bt     =new JButton("test1");
    		bt.addActionListener(this);
     
    		pane.add(txt);
    		pane.add(bt);
    		//testn°2
    		try  {        
    		    fmt = new MaskFormatter("###.###.###.###");
    		    } 
    		    catch (java.text.ParseException e)
    		    {}
    		tft1   = new JFormattedTextField(fmt);
    		tft1.setSize(20, 20);
    		BT     =new JButton("test2");
    		BT.addActionListener(this);
     
    		pane.add(tft1);
    		pane.add(BT);
     
    	      frame.getContentPane().add(pane);
    		frame.setVisible(true);
        }
    	//fonction pour test d'une @ip ecrit ds textfield
    	boolean isValidIpV4(String ip)
    	{
    		  if (ip == null || ip.trim().compareTo("") == 0) return false;  
    		  Matcher m = IP_PATTERN.matcher(ip);
    		  return m.matches();
    	}
    	//fonction pour test d'une @ip ecrit ds formattedtextfield
    	boolean isValid(String ip)
    	{
    		return false;
    	}
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Auto-generated method stub
    	 if(arg0.getSource()==bt)
    	 {   
    	 ip=txt.getText();
    	 System.out.print(ip);
    	 System.out.println(isValidIpV4(ip));
    	 }
    	 else if(arg0.getSource()==BT)
    	 {   
    		 ip1=tft1.getText();
    		 System.out.print(ip1);
    		 System.out.println(isValid(ip1));
    	 }
    	}	
     
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		test_ip inst=new test_ip();
    	}
    }
    On a deux probleme :
    1*si on ecrit 123.345.649.082 il affiche mais si on ecrit 13.34.69.082 il ne l’affiche pas
    2*j’ai pense a utiliser split(« . ») ; mais ca pas marche comment tester sur les valeurs saisie
    merci pour vous aide

  14. #14
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tu n'as pas lu le lien que je t'ais filé.

    Une expression régulière doit être utilisée avec un formatter spécifique et non avec un MaskFormatter.

    Donc si tu récupère la classe qui se trouve sur le lien plus la regexp tu peux parfaitement utiliser un JFormattedTextfield.

  15. #15
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Par défaut pas compris
    Ce que j’ai compris on n’a pas besoin de MaskFormatter on aura simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tft1   = new JFormattedTextField();
    		tft1.setSize(120, 120);
    puis lors de click sur bouton on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     //ajouter 
    		 String P="\b (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) \b";
     
    //ajouter
    		 RegExpFormatter R=new RegExpFormatter(P);
     
    		 try 
    		 {
    			R.stringToValue(tft1.getText());
    		} 
    		 catch (ParseException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    NB ans expression reguliere il manqué \ avant .

    Est-ce que ce que j’ai compris est juste ou pas .Car j’ai pas pu saisir dans ce champ il est trop petit malgre j’ai fait tft1.setSize(120, 120);

    merci

  16. #16
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Pourquoi - comme je l'ai dit plus haut - ne pas utiliser un DocumentFilter qui "bloque" la sasie de caractère rendant le format de l'adresse incorrect ? Cette solution aurait en plus l'avantage d'être réutilisable car applicable à tous les composants texte graphiques :
    monComposantText.getDocument().setDocumentFilter(monIPDocuementFilter);
    ...

  17. #17
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    ALIAS, je préfère que tu pose tes questions directement sur le forum plutôt qu'en message privé. Pour répondre à ta demande d'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public class IPDocumentFilter extends DocumentFilter{
     
       public void insertString(DocumentFilter.FilterBypass fb,int offset,int length,String text,AttributSet attr){
     
          // On ne peut insérer qu'un seul caractère à la fois :
          if(text.length()>1) return;
     
          // Si le caractère tapé n'est pas un point ni un chiffre, on annule la saisie :
          if(text.charAt(0)!='.' && !Character.isDigit(text.charAt(0)) return;
     
         // Je te laisse le soin d'implémenter ici la vérification de la validité des classes ( 0 -> 255 )
     
         // Si tout est ok, on effectue la saisie :
         try{
            fb.insert(offset,length,text);
         }catch(BadLocationException ble){
            ble.printStackTrace();
         }
       }
     
       // A toi d'implémenter de la même manière les méthodes remove ( suppression de texte ) et replace ( appelée lors d'un copier-coller ).
    }
    Je te conseille de mettre dans cette classe une référence vers le composant utilisé de manière à pouvoir récupérer son texte et pouvoir analyser si ce qui a été tapé est valide par rapport au contenu déjà présent.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo