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

 Java Discussion :

pas d'affichage après ajout d'un nouveau label


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut pas d'affichage après ajout d'un nouveau label
    Bonjour,

    dans le cadre d'un stage j'essaye de concevoir une interface Java. J'ai suivi les tutos Introduction au dessin en Java et Les bases de la création d'une interface graphique pour m'aiguiller.

    Je suis actuellement le deuxième et j'ai des erreurs qui apparaissent dans ma console au lancement de l'interface et je ne sais pas à quoi elles sont dues car elles disparaissent aussitôt et je n'ai donc pas le temps de les lire.

    Deuxième soucis :
    J'ai deux classes MyFrame (extends JFrame) et MyPanel (extends JPanel). J'ajoute mes Component depuis une classe Main à l'aide de méthodes que j'ai implémentées (type "addLabel", "addBouton", etc). Jusque là ça fonctionne (à part les erreurs au lancement).
    Lors du clic sur le bouton, dans la méthode actionPerformed de ma classe AutoParsingAction (extends AbstractAction) je souhaite affiché un texte dans l'interface. J'ai donc enregistré le MyPanel lors de la construction du AutoParsingAction pour avoir accès à l'interface. Je me sert de la méthode addLablel (qui fonctionne très bien quand je l'appelle depuis le Main) et là rien ne s'affiche !
    Je pense que le label est ajouté mais pas affiché. Comment faire ? Est-ce que ça a un rapport avec ces erreurs au lancement ??

    Merci d'avance à qui pourra m'aider, ou essayer (ce sera déjà très gentil !).

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    pour ton affichage a tu fait un repaint() ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Heu...
    En fait j'ai essayé avec un repaint mais j'ai pas implémenté de méthode paint donc je suis pas sûre que ça serve.
    Est-ce qu'il faudrait que je le fasse ?

    Parce que dans les Components que j'ajoute depuis le Main sont affichés. Pourquoi alors pas le texte que j'ajoute ?

    J'ai penser à la méthode update aussi mais elle prend un paramètre un Graphics et je ne sais pas quoi lui donner, j'ai pas très bien compris à quoi ça correspondait...

    Un peu de code si ça peut vous aider (mon problème se trouve au niveau de la classe AutoParsingAction) :
    MyPanel
    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
    public class MyPanel extends JPanel{
    	MyFrame fenetre;
    	HashMap<String, Component> map;
     
    	public MyPanel(Color color, MyFrame fenetre) {
    		this.fenetre=fenetre;
    		setBackground(color); // définition de la couleur de fond
    		setLayout(new FlowLayout()); // gestion des composant par défaut : retour à la ligne quand le bord est atteint
     
    		map=new HashMap<String, Component>();
    	}
     
    	public void addLabel(String nom, String texte){
    		JLabel label = new JLabel(texte); // on crée le texte
    		System.out.println("ajout...");
    		add(label); // on l'ajoute
    		System.out.println("ajouté");
    		map.put(nom, label);
    	}
     
    	...
     
    	public void addBoutton(String nom, AbstractAction action){
    		JButton bouton = new JButton(action); // on le crée et on lui affecte son action
    		add(bouton); // on l'ajoute
    		map.put(nom, bouton);
    	}
     
    	public void addListe(String nom, Object[] champs){
    		JComboBox liste = new JComboBox(champs); // on le crée avec ses champs
    		add(liste); // on l'ajoute l'ajoute
    		map.put(nom, liste);
    	}
     
    	public Component getComponement(String nom) {
    		Component compo = map.get(nom);
    		return compo;
    	}
    }
    Main
    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
    public class Main {
    	public static void main (String[] args){
    		/* Interface graphique */
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				//On crée une nouvelle instance la fenêtre
    				// création + configuration + mise en place des composants
    				MyFrame fenetre = new MyFrame( new FrameSet("Filtre des catalogues Fournisseurs", 400, 300, true, true, JFrame.EXIT_ON_CLOSE), new Color(230, 240, 254)); 
    				fenetre.setVisible(true);//On la rend visible
     
    				// récupération du panel
    				MyPanel panel=fenetre.getPanel();
     
    				/* ajout des composants */
    					// parsing automatique
    					panel.addLabel("label1", "...");
    					String[] champs1 = new String[]{...};
    					panel.addListe("menu1", champs1);
    					panel.addBoutton("filtrer", new AutoParsingAction("filtrer", panel));
     
    					//parsing manuel
    					panel.addLabel("label2", "...");
    					panel.addZoneDeSaisie("url", 12);
    					String[] champs2 = new String[]{...};
    					panel.addListe("menu2", champs2);
    					panel.addBoutton("filtrer", new ManParsingAction("filtrer", panel));
    			}
    		});
    	}
    }
    AutoParsingAction
    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
    public class AutoParsingAction extends AbstractAction {
    	MyPanel panel;
    	
    	public AutoParsingAction(String nom, MyPanel panel) {
    		super(nom);
    		this.panel=panel;
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		String fournisseur = (String)((JComboBox)panel.getComponement("menu1")).getSelectedItem();
    		List<ProviderList> pal = new ArrayList<ProviderList>(); // variable inutile par la suite : d'où le block.
    		
    		if(fournisseur.compareTo("Tous")==0){
    			// tous
    			pal.add(...);
    			...
    		}else if(...){
    			...
    		}else{
    			...
    		}
    		
    		// initialisation de la liste des provider à partir de l'analyse ci-dessus.
    		Provider[] provList = new Provider[pal.size()];
    		Iterator<ProviderList> it = pal.iterator();				
    		for(int i=0; i<pal.size(); i++){
    			provList[i]=setProvList(it.next());
    		}
    		
    		for(int i=0; i< provList.length; i++){
    			System.out.println("filtre de "+provList[i].getName());
    			// Mon problème :
    			panel.addLabelMultiLigne("info1","filtre de "+provList[i].getName()+"en cours...<br/>Veuillez patienter.");
    		}
    		
    	}
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    il manque le code de cette fonction

    panel.addLabelMultiLigne();

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Au temps pour moi, c'est juste. Mais le problème ne vient pas de cette méthode car (dans le doute) j'ai essayé avec la méthode addLabel toute simple et ça ne fonctionnait pas mieux.

    J'ajoute quand même le code manquant :
    MyPanel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MyPanel extends JPanel{
    	...
    	public void addLabelMultiLigne(String nom, String texte){
    		JLabel label = new JLabel("<html><body>"+texte+"</body></html>"); // on crée le texte
    		System.out.println("ajout...");
    		add(label); // on l'ajoute
    		System.out.println("ajouté");
    		map.put(nom, label);
    	}
    	...
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    a la fin de cette méthode si tu ajoute this.repaint(); ça ne marche pas mieux ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Non, désolée. Je viens d'essayer.

    Par contre j'ai légèrement modifier mon code car je me suis rendue compte d'une erreur :
    Dans le Main je défini 2 fois le bouton de nom "filtrer". Ca n'a pas d'incidence sur le Panel je pense mais sur ma HashMap oui. Donc pour chacune des méthodes qui ajoute un Component j'ai ajouté une vérification (clé existante ou non) et je lance une KeyAlreadyExistsException le cas échéant.

    Exemple pour addLabel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void addLabel(String nom, String texte) throws KeyAlreadyExistsException{
    	JLabel label = new JLabel(texte); // on crée le texte
    	add(label); // on l'ajoute
    	map.put(nom, label);
    }
    Et repaint n'a pas besoin que l'on ait implémenté paint ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    quand on ajoute des composant à un conteneur qui est déjà visible à l'écran, il faut appeler sa méthode validate(), pour lui signaler qu'il doit refaire les calcul de disposition des composants qu'il possède. Ce n'est pas automatique pour des raisons de performances.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Non pas besoin de réimplémenter paint pour appeler repaint.

    Sauf que repaint ne sert à rien dans ton cas, la méthode à appeler est plutôt revalidate qui indique à Swing que le contenu du composant a été modifié.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    En effet, c'est ce qui me manquait.

    Merci beaucoup à vous deux et à Rolfone qui a bien essayé de m'aider aussi.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    a oui désolé je me plante toujours avec repaint() et revalidate()

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

Discussions similaires

  1. Config Apache après ajout d'un nouveau war
    Par khoufouq dans le forum Websphere
    Réponses: 1
    Dernier message: 23/07/2012, 15h33
  2. Réponses: 3
    Dernier message: 10/05/2007, 07h43
  3. Mandriva refuse de demarrer apres l ajout d un nouveau dd
    Par Cazaux-Moutou-Philippe dans le forum Administration système
    Réponses: 6
    Dernier message: 24/03/2006, 10h57
  4. Réponses: 6
    Dernier message: 10/07/2004, 12h19
  5. Kernel Panic après ajout d'une nouvelle partition
    Par GLDavid dans le forum Administration système
    Réponses: 6
    Dernier message: 25/06/2004, 16h47

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