Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout de composantes à un conteneur

Les nouvelles composantes n'apparaissent pas dans toujours !

Sujet résolu
    3 mai 2010 à 18:04:30

    Salut,

    j'aimerais que certaines composantes soient ajoutées dans un conteneur après qu'un bouton ait été pressé. Mais, pour une raison ou une autre, ces composantes n'apparaissent pas dans tous les cas.

    Plus précisément, dans la situation que j'expérimente, lorsque l'utilisateur appuie sur le bouton de connexion Log, un JTextField ID et un JButton "ConfirmID" devait être ajouté au JPanel "Options". (JPanel sur lequel se trouve le bouton bouton "Log"). Voici les codes que j'ai utilisé. Ceux qui sont en commentaire, je vous en parle plus loin.
    public void LoadLogOptions()
    	{
    		System.out.println("Loading Log Options");
    		ID=new JTextField(15);//creation du JTextField
    		Options.add(ID);//Ajout du JTextField au JPanel Options 
    		
    		ConfirmID=new JButton("Valider"); //Creation du bouton ConfirmID
    		ConfirmID.setPreferredSize(new Dimension(75,20)); 
    		Options.add(ConfirmID);// Ajout du bouton au JPanel Options
    		//ConfirmID.setVisible(false);
    		//ConfirmID.setVisible(true);
    		//Log.setText("Annuler");
    		Options.repaint(); //  Abracadabra Options, repaint() pour qu'apparaissent les nouvelles composantes
    		
    	}
    

    Je pensais qu'il suffisait de repaint() le JPanel "Options" à la fin de la fonction pour que les nouvelles composantes apparaissent, mais ce n'est pas le cas. :'( En faisant des essais, j'ai pu constater que le JTextField ID apparaissait si je rendait invisible le boutton "ConfirmID" , d'où la lignes: :-°

    //ConfirmID.setVisible(false);
    


    avec seulement l'instruction ConfirmID.setVisible(false), ConfirmId n'apparait pas, c'est sur... mais bizarrement, avec l'instruction ConfirmID.setVisible(true) rien n'apparaissait o_O . Dans mes test, j'avais donc pris le parti d'utiliser les deux instructions pour m'assurer que le JTextField ID et le bouton ConfirmID apparaisse.

    Plus loin encore, je me suis rendu compte que les nouvelles composantes apparaissaient si je changeait simplement le text du boutton Log d'où l'instruction :
    //Log.setText("Annuler");
    

    Cet artifice fait mon affaire, puisque j'envisageais de changer le texte du boutton Log. Mais, je n'ai pas trop envie de recourir à ses méthodes pas très catholiques pour que mes composantes apparaissent. C'est pourquoi je les vire en les mettant en commentaires. Je les ai laissées juste pour vous illustrer tout le chemin parcouru :p

    J'aimerais que tout se fasse proprement. Comment faire pour afficher de nouvelles composantes dans un conteneur déjà peint ? Vous avez compris le truc? "Affichage après un évènement !"

    J'espère que quelqu'un saura m'aider dont le fameux Elm... J'aurais aimé maitriser la méthode paintComponent. Pas encore trouvé de documentation assez pratique.
    Jusque-là, je tâtonne beaucoup, et je ne suis paaaaaas du tout satisfait des performances de l'application. Avec les images de fond tout ralenti. Il devrait bien exister une façon de booster les performances. J'ai essayé en vain de lancer la méthode paintComponent dans un autre thread pour voir s'il aurait une amélioration. Mais, je galère toujours. La présentation de mon application est bien jolie, mais coté perf.... :'(
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2010 à 18:15:13

      Quand tu modifies les composants affichés à l'écran, il faut faire validate().
      Et là, à priori pas besoin de repaint() (sauf parfois bizarrement).
      En fait tu peux même tester, actuellement si tu réduis ta fenêtre et l'agrandis ensuite, tes composants devraient apparaître. Idem si tu redimensionnes.

      Quant à paintComponent(), y'a pas des masses de choses à savoir sur elle.
      Si tu la redéfinis, tu dois absolument placer super.paintComponent(g) dedans.
      Et éviter de lui donner trop de calculs car elle est appelée très souvent.
      Si tu as des calculs longs à faire durant ton application, il existe des classes spécialisées comme SwingWorker et le package javax.swing.SwingUtilities qui possède quelques méthodes permettant de bien dispatcher les appels de méthodes dans les bons threads.

      Le plus compliqué effectivement c'est de connaître la concurrence en Swing, qui est un très gros problème pour les développeurs débutants anglophobes.
      Il se trouve que sur les forums anglais, on trouve moins de bêtises. Peut-être parce que les tutos en anglais sont de meilleure qualité et à jour.
      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2010 à 18:49:45

        Merci Elmh
        ça marche... !
        Mais si je veux faire disparaitre les composantes que je viens d'ajouter, validate() ne suffit pas. Là je dois faire appel à repaint() !

        Encore merci !

        Je vais essayer encore de trouver sur le site de Java sun comment améliorer les performances de paintComponent().
        Mais au fait, tu m'as dit qu'il fallait absolument placer super.paintComponent(g) lorsque je redefinis paintComponent().
        Ça marche pourtant sans le super.paintComponent(g) pour moi.
        • Partager sur Facebook
        • Partager sur Twitter
          3 mai 2010 à 19:03:51

          Oui ça marche, du moins ça semble marcher je suis d'accord mais y'a un certain nombre d'actions (dont j'ignore lesquelles car ça m'est bien égal) que tu ne vois pas, qui ne sont pas faites et qui peuvent amener à des bugs plus tard.
          Exemple : sur un JPanel qui est opaque par défaut, si tu veux dessiner une image via drawImage() et que tu n'appelles pas la méthode de la classe mère, l'image ne sera pas dessinée.

          Je me moque de savoir précisément pourquoi car c'est là le principe POO : Sun me file une API et donc des méthodes, avec éventuellement une notice d'utilisation, qui stipule que pour éviter les bugs je dois faire appel à la méthode mère. Le contenu de la méthode je m'en moque totalement.

          D'ailleurs si tu veux t'amuser, tu peux même redéfinir paint() et non paintComponent() : ça marche encore ! Sauf qu'il va se produire un certain nombre d'incompatibilités AWT/Swing et le pauvre développeur n'y comprend pu rien du tout (et il va ensuite poster sur le SDZ en pleurnichant :p).
          D'un côté, le constructeur de ma pauvre voiture m'a dit de pas dépasser les 6.000 tours par minute, je l'ai jamais dépassé.
          Alors pourquoi je le ferais avec Java ?
          • Partager sur Facebook
          • Partager sur Twitter

          Ajout de composantes à un conteneur

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown