Problème java

Fermé
Kais Clubiste Messages postés 48 Date d'inscription jeudi 23 juillet 2009 Statut Membre Dernière intervention 16 janvier 2012 - 12 mars 2011 à 13:25
 ddl - 9 avril 2011 à 12:32
Bonjour, j'ai un problème au niveau d'une application java Netbeans
j'utilise une classe qui fait l'affichage des lignes dans une boucle infinie
l'affichage est réussi en mode console mais mon problème c'est que j'ai fais le développement d'une interface graphique la ou je veux faire mon affichage dans un jTextField en cliquant sur un bouton
Le problème c'est que le bouton reste bloqué et rien ne s'affiche :((((
SVP a mon aide



A voir également:

8 réponses

Utilisateur anonyme
12 mars 2011 à 18:47
Salut,

Il me semble que tu as oublié qu'un JTextField ne peut contenir qu'UNE ligne.

Il faudrait utiliser une JTextArea pour pouvoir afficher toutes les lignes...

Cordialement,

Dan
1
Kais Clubiste Messages postés 48 Date d'inscription jeudi 23 juillet 2009 Statut Membre Dernière intervention 16 janvier 2012 1
13 mars 2011 à 10:58
Meme Probleme qu'avec un jTextArea vraiment chui bloqué :(((((
0
Utilisateur anonyme
13 mars 2011 à 18:14
Salut,

Sans code il nous est impossible de deviner ce qui cloche (à part le fait que tu ne peux afficher qu'une ligne dans JTextField).

Dan
0
salut tout le monde;
j ai le même problème et je serai reconnaissante si vous essayé de m'aider.

voici un exemple:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class essayer extends JFrame implements ActionListener{

	/**
	 * @param args
	 */
	JPanel pan1=null;
	JTextArea x=null;
	JButton  ajouter=null;
	JButton  stopper=null;
	
	public essayer(){
		this.setTitle("Fenetre Principale");
		this.setSize(700,600);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    this.setLocationRelativeTo(null);
	    this.setResizable(false);
	    pan1= new JPanel();
	    this.setContentPane(pan1);
	    pan1.setLayout(null);
	     
	    x=new JTextArea();
	    x.setBounds(100,100,500, 150);
        pan1.add(x);
        ajouter=new JButton("Ajouter");
        ajouter.setBounds(150,50,120,30);
        ajouter.addActionListener(this);
        pan1.add( ajouter);
        stopper=new JButton("Stopper");
        stopper.setBounds(300,50,120,30);
        stopper.addActionListener(this);
        pan1.add( stopper);
        
	    
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     new essayer();
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource().equals(ajouter)){
		while (true){
			x.append("quelque chose"+"\n");
		}
		}else{
			
		}
	}

}


le problème est que le JTextArea affiche tout le texte après qu'il finisse;
dans le cas d'une boucle infinie il ne finit jamais;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
7 avril 2011 à 01:43
Bonjour,

Il suffit de supprimer impérativement la boucle.

Ajouter le test du clique du bouton stopper (if(e.getSource().equals(stopper)){)
sinon le clique est sans effet.
Ce qui n'empèche pas la possibilité de sortir en fermant la fenêtre (X).

Ci-dessous le code modifié (les modifs sont commentées).

J'ai également changé le nom de la classe essayer en Essayer et celui de la la méthode essayer() en Essayer() qui devient donc constructeur.

   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;

   import javax.swing.JButton;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JTextArea;


   public class Essayer extends JFrame implements ActionListener
   {
   // pour ajouter le nombre de fois n que le bouton ajouter est cliqué
   // soit  "quelque chose n"
      private int ctrAjout = 0; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   /**
    * @param args
    */
      JPanel pan1=null;
      JTextArea x=null;
      JButton  ajouter=null;
      JButton  stopper=null;
   
      public Essayer()
      {
         this.setTitle("Fenetre Principale");
         this.setSize(700,600);
         this.setVisible(true);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setLocationRelativeTo(null);
         this.setResizable(false);
         pan1= new JPanel();
         this.setContentPane(pan1);
         pan1.setLayout(null);
        
         x=new JTextArea();
         x.setBounds(100,100,500, 150);
         pan1.add(x);
         ajouter=new JButton("Ajouter");
         ajouter.setBounds(150,50,120,30);
         ajouter.addActionListener(this);
         pan1.add( ajouter);
         stopper=new JButton("Stopper");
         stopper.setBounds(300,50,120,30);
         stopper.addActionListener(this);
         pan1.add( stopper);
      }
   
   
      public static void main(String[] args)
      {
      // TODO Auto-generated method stub
         new Essayer();
      }
   
   
      @Override
      public void actionPerformed(ActionEvent e)
      {
      // TODO Auto-generated method stub
         if(e.getSource().equals(ajouter))
         {
            //while (true) // suppression de la boucle
            //{
            ctrAjout++; //<<<<<<<<<<<<<<<<<<<<<<<<
            x.append("quelque chose " + ctrAjout+"\n"); //<<<<<<<<<<<<<<<<<<<<<<<<<
            System.out.println("ctrAjout = " + ctrAjout); //<<<<<<<<<<<<<<<<<<<<<<<<<
            //}
         }
         else // ou bien fermer la fenêtre
         {
            if(e.getSource().equals(stopper)) //Sans ce test le bouton stopper ne sert à rien
               System.out.println("\nVous avez créé " + ctrAjout + " lignes.");
            System.exit(0);
         }
      }
   }


Il reste à ajouter un JScrollPane car si on crée plus de 10 lignes, à partir de la 11eme elles sont invisibles.

Bien entendu avec cet exemple on ne peut rien faire d'autre que l'affichage.

Cordialement,

Dan
0
merci de ta réponse,
mais le problème est que je veux que la boucle reste;
c-à-d lorsque je clique sur "ajouter" il ajoute successivement des lignes et lorsque je clique
sur "stopper" il arrête.
0
Re,

Mon exemple permet d'ajouter une ligne quand on clique sur ajouter.

Si tu veux en ajouter plusieurs il faudra effecticement une boucle, mais pas une boucle sans fin.
Par exemple une boucle qui permattra d'ajouter n lignes, mais sans compter sur le bouton stopper car 99 fois sur 100 (et même plus) on aura déjà ajouté un bon nombre de lignes avant l'arrêt escompté...

Le bouton stopper ne sert qu'à sortir du programme.

Supposons qu'on veut ajouter 4 lignes (pas trop car on n'a pas de Scroll):

int n = 4; 
for(int i = 1; i < n+1; i++) 
{ 
String line = "Ligne " + i + "\n"; 
x.append(line); 
ctrAjout++; 
} 

Pour le tester; ce code est à mettre à la place de:

         ctrAjout++; 
         x.append("quelque chose " + ctrAjout+"\n"); 
         System.out.println("ctrAjout = " + ctrAjout);  


Si on clique une nouvelle fois sur ajouter on ajoute encore le 4 mêmes lignes.

Dans la réalité, le trairement consisterait par exemple à ajouter les lignes d'un fichier texte...

Dan
0
merci beaucoup pour la deuxième fois,
oui, ça marche avec un nombre limité d'itérations car le JTextArea affiche tous à la fois et à la fin.
(et j'ai ajouté un JScrollPane, pas de problème(; )
je croix que je dois chercher un autre composant graphique si je veux un affichage successif des lignes, car je ne voie aucune solution avec le JTextArea...
0
sakoba2010 Messages postés 157 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 24 juillet 2013 15
8 avril 2011 à 17:00
Utilises un Thread et tout sera réglé.
0
d'accord, je vais essayer...
0
:)))) j'ai utilisé un thread et ça marche, voici le code:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class essayer extends JFrame implements ActionListener{

	/**
	 * @param args
	 */
	JPanel pan1=null;
	JTextArea x=null;
	JButton  ajouter=null;
	JButton  stopper=null;
	UnThread thread =null;
	
	public essayer(){
		this.setTitle("Fenetre Principale");
		this.setSize(700,600);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    this.setLocationRelativeTo(null);
	    this.setResizable(false);
	    pan1= new JPanel();
	    this.setContentPane(pan1);
	    pan1.setLayout(null);
	     
	    x=new JTextArea();
	    thread = new UnThread(); 
	    
        JScrollPane sp=new JScrollPane(x);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        sp.setBounds(100,100,500, 150);
        pan1.add(sp);
        
        ajouter=new JButton("Ajouter");
        ajouter.setBounds(150,50,120,30);
        ajouter.addActionListener(this);
        pan1.add( ajouter);
        stopper=new JButton("Stopper");
        stopper.setBounds(300,50,120,30);
        stopper.addActionListener(this);
        pan1.add( stopper);	    
	}	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     new essayer();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource().equals(ajouter)){
			thread.start();
		               
		}else{
			if(e.getSource().equals(stopper)) 
	            thread.stop() ;
		}
	}

 class UnThread extends Thread{
	  public void run() {
	    long start = System.currentTimeMillis();
	    // boucle tant que la durée de vie du Thread est < à 10 secondes
	    while( System.currentTimeMillis() < ( start + (1000 * 10))) {
	      
	      x.append("quelque chose"+"\n");
	      try {
	        // pause
	        Thread.sleep(150);
	      }
	      catch (InterruptedException ex) {}
	    }
	  }	
	}
}


j'ai une autre question: si je fais "stopper" puis je veux reprendre, je dois faire quoi?
0
sakoba2010 Messages postés 157 Date d'inscription lundi 7 février 2011 Statut Membre Dernière intervention 24 juillet 2013 15
9 avril 2011 à 10:25
Dans ce cas il faut utiliser méthode synchronisée qui retourne deux états (true/false) .
Bon courage
0
merci beaucoup de ton aide, je vais essayer ça.
0