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

Agents de placement/Fenêtres Java Discussion :

[JFrame]Rafraichissement d'une JFrame


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 64
    Par défaut [JFrame]Rafraichissement d'une JFrame
    Bonjour a tous,
    j'ai un problème avec le raffraichissement d'une JFrame, le soft n'est pas compliqué, j'affiche une fenetre avec un champ de saisie (JTextField) ou je peux saisir un numéro. Une fois ce numéro saisi, j'appuie sur entrée et la je raffraichi ma fenetre pour afficher la meme chose + en dessous le numéro saisi avec a coté de lui un bouton afin de le supprimer (une fois toutes les saisies finies, on appuie sur un troisieme bouton et des modifications s'effectuent sur une base de données concernant ces numéros mais ca j'ai pas encore fait...). Mon problème est qu'afin de rafraichir ma fenetre, je fais un JFrame.removeAll(), j'assigne a ma frame un nouveau GridLayout avec les bonnes dimensions puis je rajoute tous mes composants a chaque fois mais une fois le removeAll() executé, plus rien ne s'affiche dans la fenetre (c'est tout gris). Si j'enleve le removeAll(), le premier ajout se passe bien mais apres le second, il y a des doublons. Je ne peux pas utilise le remove(int index) car je ne connais pas comment fonctionne le GridLayout a ce niveau.
    Voila le code (dsl ca va etre un peu long) :
    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
    82
    83
    84
    85
    86
    87
    88
    89
     
    public class activeIncidentMainFrame extends JFrame implements ActionListener{
    	JLabel incidentTextLabel = null;
    	JTextField  incidentTextField = null;
     
    	activeIncidentMainFrame(String title) {
    		super(title);
    		//on centre la fenetre
    		this.setLocationRelativeTo(this.getParent());
    		//on applique un gridLayout sur cette fenetre afin d'afficher le JLabel suivi du champ de saisie sur la meme ligne
    		this.setLayout(new GridLayout(1,2));
    		//ajout d'un champ texte de saisie dans la fenetre et placement dans la fenetre
    		incidentTextLabel = new JLabel("numéro d\'incident à activer : ");
    		this.getContentPane().add(incidentTextLabel);
    		incidentTextField = new JTextField ();
    		this.getContentPane().add(incidentTextField);
    		//ajout d'un listener sur ce composant, this est ce listener
    		incidentTextField.addActionListener(this);
                    this.pack();
    		this.setVisible(true);
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
    		//on recupere le nom de la classe générant l'evenement
    		String className = arg0.getSource().getClass().getName();
    		//ici on traitera les evenements levés par le JTextField
    		if(className == "javax.swing.JTextField") {
    			String incidentNumber = arg0.getActionCommand();
    			//on recupere la ref du JTextField qui a appelé afin d'y effacer le texte renseigné
    			JTextField jtfWhocall = (JTextField)arg0.getSource();
    			jtfWhocall.setText(null);
    			//on recupere une instance du controlleur d'incident
    			activeIncidentController controller = activeIncidentController.getInstance();
    			//on envoie le numéro d'incident au controlleur et affiche un message d'erreur si
    			//on considère le champ comme mal formaté sinon on redessine la fenetre
    			if(!controller.addIncidentToActivate(incidentNumber))
    				printErrorMessage();
    			else this.redraw();
    		}
    		//ici on traitera les evenements levés par les JButtons
    		else if(className == "javax.swing.JButton"){
    			String buttonName = arg0.getActionCommand();
                            //pas encore fait
    		}
    	}
     
    	private void printErrorMessage() {
    		JOptionPane.showMessageDialog(this, "le texte saisi ne semble pas être un numero d'incident","ugh",JOptionPane.WARNING_MESSAGE);
     
    	}
     
    	//affiche le champ de saisie dans la JFrame
    	private void printChampSaisie() {
    		incidentTextLabel = new JLabel("numéro d\'incident à activer : ");
    		incidentTextField = new JTextField ();
    		this.getContentPane().add(incidentTextLabel);
    		this.getContentPane().add(incidentTextField);		
    	}
     
            //afficher une ligne pour chaque numéro d'incident precedemment        //saisi avec a coté un bouton supprimer afin de pouvoir l'enlever de la //liste
    	public void drawIncidentLine(Object o, int index){
    		//on cast l'objet en string puisque qu'actuellement,il ne tient qu'a ca
    		String incidentNumber = (String)o;
    		System.out.println("on est dans drawIncidentLine, le numero d incident est le : "+incidentNumber);
    		//label permettant d'afficher le numéro d'incident
    		JLabel incidentNumberLabel = new JLabel(incidentNumber+" ");
    		JButton removeIncidentFromList = new JButton("remove");
    		//action command renvoyé par le bouton sera son index
    		removeIncidentFromList.setActionCommand(Integer.toString(index));
    		this.getContentPane().add(incidentNumberLabel);
    		this.getContentPane().add(removeIncidentFromList);
     
    	}
    	//redessiner la fenetre apres une action
    	private void redraw() 
    		//on recupere le nombre d'incidents a afficher
    		activeIncidentController controller = activeIncidentController.getInstance();
    		int incidentListSize = controller.getIncidentToActivateListSize();
    		//on enleve tous les composants de la Frame avant de les redessiner
    		this.removeAll();
    		//on fait un nouveau layout avec le nombre de lignese qu'il faut, + 1 pour le champ de saisie qu'on met au debut
    		this.setLayout(new GridLayout(incidentListSize+1,2));
    		printChampSaisie();
    		Object[] incidentList = controller.returnIncidentArray();
    		for(int i=0;i<incidentList.length;i++)
    			drawIncidentLine(incidentList[i], i);
    		this.pack();
    	}
    }
    Voila donc la methode removeAll problematique se trouve dans ma méthode redraw(). Merci beaucoup d'avance a qui pourra m'aider car la j'ai essayé plein de trucs mais je ne vois pas d'ou vient le problème.... J'accepte aussi tout commentaires sur le code d'une maniere générale étant donné que je suis debutant en IHM java

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 64
    Par défaut
    juste une petite précision : j'execute bien a la fin du constructeur la methode pack() et setVisible(true), j'ai édité le code.

  3. #3
    Membre éprouvé Avatar de dr00w
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 116
    Par défaut
    Si tu peux poster la partie relevante du code de ton controller je pourrais regarder ça de plus près.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 64
    Par défaut
    merci de ton aide , je joint le code du controlleur mais je doute qu'il s'agisse du problème car c'est plutot la partie stockage des données et que le problème me semble vraiment lié à la partie IHM qui est tout entiere contenue dans la classe ci dessus. Je pense que le problème ne doit pas être très complexe mais la je cale carrement, je pense que la faute doit etre dans la facon de gérer la JFrame : removeAll, nouveau GridLayout, méthode add...
    En tout cas, voila le code :
    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
     
    public class activeIncidentController {
    	//singleton design pattern
    	private static activeIncidentController instance = new activeIncidentController();
        private ArrayList incidentList = null;
     
     
    	public static activeIncidentController getInstance() {
            return instance;
        }
        private activeIncidentController() {
            incidentList = new ArrayList();
        }
     
        //methode chargée de renvoyer true si le numéro d'incident est ok, false s'il y a un problème
        private boolean checkIncidentNumber(String incidentNumber) {
        	//pattern representant chaque caractère qui doit etre numérique
        	Pattern p = Pattern.compile("[0-9]");
        	Matcher m = null;
        	int incidentNumberStringSize = incidentNumber.length();
        	//recuperation de chaque caractère dans un tableau
        	char[] incidentNumberCharacters = new char[incidentNumberStringSize];
        	//conditions :
        	//taille < 6
        	if(incidentNumberStringSize>6)
        		return false;
        	//chaque caractere doit etre numérique
        	incidentNumberCharacters = incidentNumber.toCharArray() ;
        	for(int i =0;i<incidentNumberCharacters.length;i++) {
        		m = p.matcher(String.valueOf(incidentNumberCharacters[i]));
        		if(!m.matches())
        			return false;
        	}
        	//le numero saisi ne doit pas déjà etre present dans la liste
        	if(incidentList.contains(incidentNumber))
        		return false;
        	return true;
     
     
        }
        public boolean addIncidentToActivate(String incidentNumber) {
        	//si la string saisie n'est pas correcte on envoit false
        	if(!checkIncidentNumber(incidentNumber))
        		return false;
        	//on ajoute le numéro d'incident dans la liste
        	incidentList.add(incidentNumber);
        	return true;
        }
     
        //enlever un numero d'incident de la liste via son index
        public void removeIncidentToActivate(String incidentNumber) {
        	incidentList.remove(incidentNumber);
        }
     
        public Object[] returnIncidentArray(){
        	return incidentList.toArray();
        }
     
        //renvoyer la taille de la liste
        public int getIncidentToActivateListSize() {
        	return incidentList.size();
        }
    }
    Merci beaucoup!!

  5. #5
    Membre éprouvé Avatar de dr00w
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 116
    Par défaut
    J'ai pas eu le temps de tout vérifier mais je pense que ça vient du fait que tu utilise un GridLayout avec 1 ligne, 2 colonnes. Essai de changer de layout genre FlowLayout pour tester.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 64
    Par défaut
    Je viens d'essayer de remplacer le gridLayout par un FlowLayout mais rien n'y fait j'ai toujours une fenetre vide apres l'execution de la méthode redraw() En fait le symptome précis est : le contenu de la fenetre ne s'affiche meme plus apres redraw(), on voit juste la barre du haut (la barre ou sont positionnés les boutons "fermer"(croix) "minimiser"....), je peux l'agrandir mais je n'y vois que du grisé....
    En fait la question est : comment réafficher une JFrame composé de composants générés de manière dynamique?
    merci d'avance...

Discussions similaires

  1. extends d'une JFrame et d'une class?
    Par absot dans le forum Général Java
    Réponses: 3
    Dernier message: 20/11/2009, 10h03
  2. accèder à une JFrame à partir d'une JDialog modale
    Par melle_marwa dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 07/05/2009, 22h42
  3. problème de rafraichissement d'une JFrame
    Par MeDReD dans le forum Débuter
    Réponses: 8
    Dernier message: 21/07/2008, 20h19
  4. Ouvrir une JFrame à partir d'une autre
    Par seyar666 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 09/03/2007, 15h53
  5. Image de fond sur une JFrame et dans une JToolBar
    Par FredPsy dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 01/02/2007, 18h12

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