[Java] JTextArea, KeyListener, Touche Entrée

Résolu/Fermé
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 10 juil. 2011 à 03:43
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 10 juil. 2011 à 17:56
Bonjour,

Dans une application Java Swing, j'aimerai récupérer la valeur de mon JTextArea dès que l'utilisateur tape sur "Entrée". Je suppose qu'il faut faire cela avec des KeyListener mais je ne sais pas comment faire pour attendre que l'évènement se produise.

Dans mon code j'ai quelque chose comme ça :

private JTextArea area;

public String saisie(String patron)
{
     area.setText(patron);
     area.setEditable(true);
     
     // Attendre l'appuie sur la touche Entrée
     
     String str = console.getText();
     area.setText("");
     area.setEditable(false);

     return str;
}

public String saisie()
{
     return saisie("");
}

public static void main()
{
     String nom = saisie();
     String date = saisie("jj/mm/aaaa");
     String heure = saisie("hh:mm");
}

Je ne sais pas si c'est très clair, mais si quelqu'un peut m'aiguiller je l'en remercie d'avance ;-)
A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 juil. 2011 à 17:56
Bon j'ai pas mal galéré, mais voici une manière de résoudre mon problème...

public void keyPressed(KeyEvent e) 
{	
	if (e.getKeyCode() == KeyEvent.VK_ENTER)
	{
		synchronized(this)
		{
			this.notifyAll();
		}
	}
}

//-----------------------------------------

public String saisie(String patron)
{
	area.setText(patron);
	area.setEditable(true);
	
	synchronized(area)
	{
		try
		{
			area.wait();
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
	
	area.setEditable(false);
	String str = area.getText();
	area.setText("");	
	
	return str;
}
2
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018 63
10 juil. 2011 à 06:48
Salut, normalement dans un jtextarea la touche entrée sert à revenir à la ligne, enfin, tu peux te faire un objet qui hérite de jtextarea implementant keylistner:

public class Ton_textArea extends JTextArea implements KeyListener {

    public Ton_textArea() {
        addKeyListener(this);
    }
    public void keyTyped(KeyEvent e) {
    }
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
        //traitement sur la touche entrée
        }
    }
    public void keyReleased(KeyEvent e) {
    }
}


et puis dans ton code tu utilise cet objet à la place du Jtextarea:

private Ton_textArea area;

public String saisie(String patron)
{
     area.setText(patron);
     area.setEditable(true);   
     String str = console.getText();
     area.setText("");
     area.setEditable(false);

     return str;
}

public String saisie()
{
     return saisie("");
}

public static void main()
{
     String nom = saisie();
     String date = saisie("jj/mm/aaaa");
     String heure = saisie("hh:mm");
}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 juil. 2011 à 12:55
Merci de me répondre, cependant j'avais bien compris le principe du KeyListener, mon problème vient du fait que je ne sais pas comment attendre que l'évènement se produise, et seulement une fois celui-ci produit continuer mon programme.

En gros je voudrais faire quelque chose comme ceci, mais ici la boucle while va me pomper toute la CPU ce qui est loin d'être idéal...

public boolean entree;

public void keyPressed(KeyEvent e)
{
     if (e.getKeyCode() == KeyEvent.VK_ENTER)
     {
          entree=true; // touche Entrée appuyée
     }
}

//----------------------------------

public String saisie(String patron)
{
     area.setText(patron);
     area.setEditable(true);
 
     area.entree=false;
     while (!area.entree); // attendre l'appuie de la touche Entrée

     area.setEditable(false);
     String str = console.getText();
     area.setText("");

     return str;
}

Si tu as une idée ^^
0
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018 63
10 juil. 2011 à 13:10
Pourquoi ne continu tu pas simplement ton programme dans le if du keypressed, du style:

public void keyPressed(KeyEvent e)
{
     if (e.getKeyCode() == KeyEvent.VK_ENTER)
     {
          area.setEditable(false);
          String str = console.getText();
          area.setText("");
     }
}


c'est bien sûr pas exactement ça, mais dans l'esprit.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 juil. 2011 à 13:33
Le problème c'est que ma fonction saisie() doit être bloquante, or elle est synchrone tandis que l'évènement KeyEvent est asynchrone. Donc il me faudrait un moyen pour que la méthode saisie() soit bloquée jusqu'à ce que le KeyEvent.VK_ENTER ait lieu, et qu'une fois celui-ci relevé je débloque ma méthode saisie() pour faire mon return str;

En gros je veux faire une console, où je dois attendre que l'utilisateur valide sa saisie avant de continuer le programme avec la valeur donnée...
0
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018 63
10 juil. 2011 à 13:36
Alors peut être faut il utiliser les thread, mais là ça dépasse un peu mon niveau en java désolé.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 juil. 2011 à 13:41
En fait ce serait plutôt un anti-thread qu'il me faut ^^
Pour synchroniser les KeyEvent qui sont déjà des threads...
0
dariumis Messages postés 571 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 18 avril 2018 63
10 juil. 2011 à 14:00
Après je ne pense que ton while de tout à l'heure soit si gourmand en cpu
  while (!area.entree); // attendre l'appuie de la touche Entrée


Vu que tu ne fais rien dans son bloc, on fait bien des boucles infinie, pour les programme client serveur, ou les jeux. ou les traitement sont important, et ça reste rapide d'execution. Mais la j'suis désolé, moi je répondrais plus, car j'ai pas le niveau en fait, désolé, d'avoir pourris ton sujet ^^.
0