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 vide lorsqu'elle est appelée


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 66
    Points : 54
    Points
    54
    Par défaut JFrame vide lorsqu'elle est appelée
    Bonjour,

    Je bosse actuellement sur un moteur de jeu, et j'aimerais pouvoir ouvrir une fenêtre qui me permette de choisir un fichier sauvegardé en XML et le charger.

    J'ai donc créé une classe qui me permet de voir les fichiers xml dans un dossier donné, et d'en sélectionner un ou pas.

    Lorsque je lançais ma fenêtre seule, en lui donnant un nom de dossier, tout se passait bien.

    Seulement voilà, lorsque je l'appelle depuis mon moteur, elle bloque, n'affiche rien et ne veut même plus se fermer

    La classe de la fenêtre de chargement :
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.*;
    import java.lang.*;
    import java.net.*;
     
    class ChargPerso
    {
     
    	String[] listeSauv = new String[0];
     
    	public String choix;
     
     
    	//éléments graphiques
    	public JFrame frame = new JFrame();
     
    	JList liste;
    	JButton btnNouvellePartie;
    	JButton btnCharger;
    	JButton btnAnnuler;
     
    	public String repSauv;
    	ActionListener action;
     
    	public ChargPerso(String chemin)
    	{
    		repSauv=chemin;
     
    		action = (new ActionListener(){
    			public void actionPerformed(ActionEvent e)
    			{
    				String bouton=e.getActionCommand();
    				if(bouton.equals("Annuler"))
    				{
    					choix="annul";
    				}
    				else if(bouton.equals("Charger"))
    				{
    					choix=(String)liste.getSelectedValue();
    					if(choix==null)
    					{
    						if((dialogue("Aucune sauvegarde sélectionnée\nVoulez-vous commencer une nouvelle partie ?",""))==JOptionPane.YES_OPTION)choix="null";
    					}
    				}
    				else if(bouton.equals("Nouvelle Partie"))
    				{
    					choix="null";
    				}
    			}
    		});
     
    		initComponents();
     
    	}
     
     
     
     
    	public void initComponents()
    	{
    		Container conteneur = frame.getContentPane();
     
    		//déclaration des JPanel
    		JPanel txtPanel = new JPanel();
    		JPanel listPanel = new JPanel();
    		JPanel btnPanel = new JPanel();
     
    		//Container conteneurBtn = btnPanel.getContentPane();
     
    		//ajout du texte
    		txtPanel.add(new JLabel("Selectionnez une Sauvegarde"));
     
    		//ajout du bouton Lancer
    		configureBouton("Nouvelle Partie", btnPanel, btnNouvellePartie);
    		configureBouton("Charger", btnPanel, btnCharger);
    		configureBouton("Annuler", btnPanel, btnAnnuler);
     
     
    		//ajout de la liste
    		recupSauv(new File(repSauv));
    		liste = new JList(listeSauv);
    		liste.setFixedCellWidth(300);//largeur des lignes fixée à 300
    		liste.setSelectionMode(0);//on ne peut sélectionner qu'un seul élément à la fois
    		listPanel.add(liste);
     
     
     
    		conteneur.setLayout(new BorderLayout(5,5));
    		conteneur.add(txtPanel, BorderLayout.NORTH);
    		conteneur.add(listPanel, BorderLayout.CENTER);
    		conteneur.add(btnPanel, BorderLayout.SOUTH);
     
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setResizable(true);
    		frame.pack();
    		frame.setLocationRelativeTo(frame.getParent());//centre la fenêtre à la écran
    		frame.setVisible(true);
     
    	}//fin initComponents()
     
     
    	public void configureBouton(String s, JPanel panel,JButton bouton)
    	{
    		bouton = new JButton(s);
    		bouton.setActionCommand(s);
    		bouton.addActionListener(action);
    		panel.add(bouton);
    	}
     
     
    	//recupère la liste des fichiers finissants par l'extension
    	//.xml dans le répertoire passé en paramètre
    	public void recupSauv(File repertoire)
    	{
    		String [] listeFichiers;
    		String ext=new String(".xml");
    		int i;
    		int nombreFichiers=0;
    		int j=0;
    		listeFichiers=repertoire.list();
     
     
    		//on compte le nombre de fois où on a un fichier qui fini par l'extension ext
    		for(i=0;i<listeFichiers.length;i++)
    		{
    			if(listeFichiers[i].endsWith(ext)==true)
    			{
    				nombreFichiers++;
    			}
    		}
     
    		listeSauv= new String [nombreFichiers];
     
    		//on récupère la liste de fichiers qui finissent pas l'extension ext
    		for(i=0;i<listeFichiers.length;i++)
    		{
    			if(listeFichiers[i].endsWith(ext)==true)
    			{
    				listeSauv[j]=listeFichiers[i];
    				j++;
    			}
    		}
    	}//fin recupJeux()
     
     
    	/**
             * Ouvre une boite de dialogue avec option OUI/NON
             * avec comme titre de fenêtre le String titre
             * et comme texte affiché le String message
             */
    	public int dialogue(String message, String titre)
    	{
    		return JOptionPane.showConfirmDialog(frame,message,titre,JOptionPane.YES_NO_OPTION);
    	}//fin dialogue()
     
    }
    la fonction qui l'appelle :
    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
    	public void chargementSauv()
    	{
    		pause=true;
    		ChargPerso charg = new ChargPerso(jeu.cheminDossier+jeu.repSauv);
    		String sauv=null;
     
    		//on fait une pause de 0.1 seconde pour laiser le temps à la fenêtre de s'initialiser
    		try{
    		Thread.sleep(1000);
    		}catch(Exception ex){ex.printStackTrace();}
     
    		while(sauv==null)
    		{
    			//pour ne pas que la boucle soit trop rapide
    			try{
    				Thread.sleep(100);
    			}catch(Exception ex){ex.printStackTrace();}
     
    			sauv=charg.choix;
    		}
     
    		//clic sur nouvelle partie
    		if(sauv.equals("null"))
    		{
    			pPerso=jeu.persoDefaut;
    			chargementPerso();
    			charg.frame.dispose();
    			affichage();
    		}
     
    		//clic sur annuler
    		else if(sauv.equals("annul"))
    		{
    			charg.frame.dispose();
    		}
     
    		//un fichier à charger a été choisi
    		else
    		{
    			decodagePerso(jeu.cheminDossier+jeu.repSauv+sauv);
    			chargementPerso();
    			charg.frame.dispose();
    			affichage();
    		}
    		pause=false;
    	}
    Que faire ?
    Merci pour toute réponse !

  2. #2
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 66
    Points : 54
    Points
    54
    Par défaut
    J'ai oublié de préciser que ma méthode qui crée l'objet ChargePerso était appelée dans un KeyListener, donc un classe interne.

    Et le problème a l'air de venir de là
    Pour ma classe de Sauvegarde, je n'ai aucun problème, je lui passe en argument le dossier où elle doit metre la sauvegarde.

    Mais pour le chargement, je dois récupérer la saisie de l'utilisateur, l'apparition de l'utilitaire de saisie étant provoqué par l'appui sur une touche.

    Y a-t-il une façon idéale de faire ça ?

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    J'ai eu la flemme de regarder ton code, désolé , mais une chtite question en passant : si tu veux juste pouvoir sélectionner un fichier xml, pourquoi tu n'utilises pas directement un JFileChooser ?

  4. #4
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 66
    Points : 54
    Points
    54
    Par défaut
    Parce que je ne veux pas que l'on puisse choisir son dossier.

    Et je ne veux pas que l'on voit que ce sont des fichiers xml.
    Lorsqu'un joueur sauvegarde sa partie, il spécifie juste un nom, sans extension. De même, quand il charge une partie, j'enlève l'extension à l'affichage.

    Pour mon problème, j'ai réglé ça façon un peu bourinos...
    J'ai créé un Thread qui prend en paramètre un moteur et une fenêtre de chargement, et qui vérifie constament si un fichier de sauvegarde a été sélectionné.

    C'est bourrin, mais c'est la seule manière que j'ai finalement trouvé pour synchroniser tout ça.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Plusieurs choses :
    1) le plus simple à mon goût pour créer une JFrame c'est de te créer une classe qui étend JFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class ChargePerso extends JFrame {
         [...]
    }
    Comme ça, une fois que t'as instancié ta classe ChargePerso, t'as plus qu'à la rendre visible et elle s'affichera comme il faut normalement.

    2) les layout se basent en général sur la preferredSize des composants qu'ils sont sensés afficher pour gérer leur répoartition. Tu ne spécifies aucune de ces tailles, du coup le layout doit mettre des tailles nulles...

    3) le coup des Timer pour laisser le temps à la frame de s'initialiser, etc, ça sent pas trop bon quand même...
    Je te conseille plutôt de te créer une JDialog (au lieu d'une JFrame) que tu rend modale de manière à ce que le programme attende que tu aies fermer la boîte de dialogue avant de poursuivre son exécution. JDialog et JFrame se comporte quasiment de la même manière donc ton code ne changera pas des masses.
    Au cas où, jète un coup d'oeil sur cette doc...

    Après, pourquoi ça machait en solo et pas lancé depuis ton appli, je ne vois pas trop... Peut-être une différence de configuration style "Java Application" au lieu de "AWT Application" sous Eclipse (ça m'avait déjà causé certains problèmes aux niveau de l'utilisation de dll).

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Petite question supplémentaire : t'as un crash ou ça ne fait que bloquer ton IHM ?

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 66
    Points : 54
    Points
    54
    Par défaut
    en fait ça faisait bloquer mon IHM

    merci pour la Doc sur les JDialog, je ne sais pas si ça fonctionnera mieux, mais je sais que pour l'instant, mes JDialog s'affichaient bien.
    Donc, si j'ai le temps, j'essaierais ça.

    En fait, ça plantait parce que je mettais une boucle qui attendait que dans la fenêtre de chargement, l'utilisateur ait choisi (ou pas), un fichier à charger.
    Et tout ça était appelé par mon KeyListener (qui est une classe interne de mon moteur).
    Du coup, je crée la fenêtre dans en étant dans ma classe interne, mais je n'en sort pas (de la classe interne) vu que j'attends une réponse.

    Pourquoi mon sleep qui laisse le temps à la frmae de s'initialiser c'est pas top ? (bon ok, c'est crado niveau code, mais bon, ça rends l'appli plus agréable à regarder)

  8. #8
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par superpigeon
    En fait, ça plantait parce que je mettais une boucle qui attendait que dans la fenêtre de chargement, l'utilisateur ait choisi (ou pas), un fichier à charger.
    Et tout ça était appelé par mon KeyListener (qui est une classe interne de mon moteur).
    Du coup, je crée la fenêtre dans en étant dans ma classe interne, mais je n'en sort pas (de la classe interne) vu que j'attends une réponse.
    Attention là...
    Y'a sûrement un truc à creuser avec l'EventDispatchingThread. Je ne sais plus exactement comment ça fonctionne, mais c'est le thread qui est chargé de rafraîchir les IHM. Sauf qu'il me semble qu'il est aussi utilisé pour les listener.
    Donc si tu crées ta fenêtre dans un listener et que tu lances ta boucle while qui fait des sleep lors de la création, ben du coup tu boucles indéfiniment au lieu de rafraîchir tes IHM...
    Il faudrait retrouver les post qui parlent de ça (ou demander à Gfx, il me semble que c'est lui qui en parlait le mieux).


    Citation Envoyé par superpigeon
    Pourquoi mon sleep qui laisse le temps à la frmae de s'initialiser c'est pas top ? (bon ok, c'est crado niveau code, mais bon, ça rends l'appli plus agréable à regarder)
    Ben disons que tu fais des sleep pour attendre une saisie de l'utilisateur alors qu'une JDialog modale te permet d'afficher une fenêtre toute belle et d'attendre la saisie de l'utilisateur de manière transparente.
    De plus tes sleep bloquent l'exécution du programme, donc tu consommes du temps CPU pour rien, et en plus tu peux empêcher certains mécanismes tels que le rafraîchissement s'ils sont mal placés.
    Bref, c'est pas beau

  9. #9
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2006
    Messages : 66
    Points : 54
    Points
    54
    Par défaut
    Ok ! Merci pour l'EventDispatchingThread, je sais pas ce que c'est mais ça correspondrait bien à ma fenêtre qui se rafraichit pas parce que je sors pas du listener.


    En fait... le Sleep je l'avais mis justement pour éviter d'avoir (encore pire) un while vide qui tourne et qui tourne et... super vite et le CPU qui monte et qui monte... Mais c'est vrai que si avec une JDialog je peux attendre tout simplement que ma JDialog me renvoie une réponse, ce serait chouette.
    Je tenterais ça!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/01/2008, 18h42
  2. Réponses: 2
    Dernier message: 10/05/2007, 22h19
  3. [VBA-E] masquer une combo lorsqu'elle est vide
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 46
    Dernier message: 04/02/2007, 21h16
  4. Remplacer une ressource du réseau lorsqu'elle est utilisée
    Par Charette dans le forum Web & réseau
    Réponses: 6
    Dernier message: 22/06/2005, 11h46
  5. Réponses: 3
    Dernier message: 26/02/2005, 09h33

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