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

AWT/Swing Java Discussion :

[débutant] création de composants perso


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Par défaut [débutant] création de composants perso
    Salut à vous !

    Dans ma découverte des GUI avec java, je suis confronté à un second problème.
    Tout d'abord, le code source:

    Une fenêtre de type JFrame
    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
     
    package test;   
    import javax.swing.JFrame;   
     
    public class TestFrame extends JFrame {  
     
    	private TestPanel tp_; 
     
    	public TestFrame(){  
    		tp_ = new TestPanel(); 
    		getContentPane().add(tp_); 
    		pack(); 
    	}  
     
    	public static void main(String args[]){  
    		TestFrame tf = new TestFrame(); 
    		tf.setVisible(true); 
    	}  
     
    }
    Contenant un JPanel
    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
     
    package test;
     
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Point;
    import javax.swing.ImageIcon;
    import javax.swing.JPanel;
    import java.net.URL;
     
    public class TestPanel extends JPanel{
     
        private static Image background_;
     
        public TestPanel() {
            setPreferredSize(500,500);
            URL backgroundURL = this.getClass().getResource("background.jpg");
            background_ = new ImageIcon(backgroundURL).getImage();
            this.add(new ComposantPerso1(new Point(50,50)));    
            this.add(new ComposantPerso1(new Point(100,100)));            
    }
     
        public void paint(Graphics g){
            g.drawImage(background_,0,0,this); // dessine l'image de fond -> FONCTIONNE
            // Appel recursif cradingue à repaint() mais bon ...
            repaint(); // devrait appeler le paint() des composants non ? -> FONCTIONNE PAS: les composants ne s'affichent pas
        }
     
    }
    Qui contient des composants perso
    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
     
    package test;
     
     
    import java.awt.Color;
    import java.awt.Point;
    import java.awt.Graphics;
    import javax.swing.JComponent;
     
    public class ComposantPerso1 extends JComponent{
     
        private static Color couleur_ = Color.BLACK;
        private Point coordonnees_;
     
        public ComposantPerso1() {
            super();
        }
     
        public ComposantPerso1(Point coordonnees){
            this();
            coordonnees_ = coordonnees;
            System.out.println("======================== Creation ComposantPerso1");
        }
     
        public void paint(Graphics g){
            g.setColor(couleur_);
            g.fillRect(coordonnees_.x, coordonnees_.y, 10,10);
            System.out.println("======================== appel a paint() du composant perso"); // Jamais printé.
        }
     
    }
    Je m'explique avec plus de détail:
    Je possède des composants graphiques (ComposantPersoXX) qui représentent l'état d'objets modèles. (J'essaie de mettre en place le pattern MVC correctement.)

    Ces composants devraient pouvoir se modifier en fonction des modifications apportées au modèle. Pour cela je mets en place le pattern Observer, en faisant implementer mes ComposantPersoXX de l'interface Observer ().
    Mes composants ont donc une méthode update() que je n'ai pas fait figurer ici pour plus de clarté.

    Mon problème majeur est que les composants ne s'affichent pas du tout dans le JPanel. On peut voir qu'aucun appel à la méthode paint() de ComposantPerso1 n'est jamais effectué.

    Pourriez vous m'expliquer pourquoi ? (D'autant plus que mon jPanel sait qu'il a un composant ...Pourquoi ne les paint il pas lorsqu'il reçoit un repaint() ? )

    En tout cas merci et bonne fin de journée

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Dans ton panel, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
        public void paint(Graphics g){
            g.drawImage(background_,0,0,this); // dessine l'image de fond -> FONCTIONNE
            // Appel recursif cradingue à repaint() mais bon ...
            repaint(); // devrait appeler le paint() des composants non ? -> FONCTIONNE PAS: les composants ne s'affichent pas
        }
     
    }
    Essaie plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public void paint(Graphics g){
            g.drawImage(background_,0,0,this); // dessine l'image de fond -> FONCTIONNE
           super.paint(g)
        }
     
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Par défaut
    merci pr ton renseignement
    desormais la methode paint est bien appelée, mais le pb est que le composant ne s'afffiche pas, seul le background s'affiche.
    merci d'avance

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    apparemment, tu veux placer tes composants perso de manière absolue (ce n'est pas forcément recommandé, mais vu ton application, il se peut que ça soit mieux). Jette toujours un oeil du côté des Layouts, ça peut toujours servir.

    Pour le positionnement absolu, il faut :
    - mettre le layout de ton JPanel à null (appelle super(null); dans le constructeur de TestPanel)
    - appliquer une position et une taille à tous les enfants du TestPanel. Je te conseille d'appeler setBounds(coordonnees.x, coordonnees.y, 10, 10); dans le constructeur des ComposantsPerso. Par défaut, la taille est de (0, 0), donc même si ton composant est affiché, tu ne le verras pas.
    - appeler fillRect(0, 0, 10, 10);. Un composant ne peut pas peindre "à l'extérieur de lui-même" (il me semble).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Par défaut
    ça a l'air de marcher, je testerai plus en détail
    merci bien
    par contre j'aimerai te demander ce que tu entends par "pas forcement recommandé", existe t il une maniere plus "classe" de prrocéder.
    mici encore

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ce qui est recommandé est d'utiliser les différents layoutsmanagers en fonction de leurs spécificité. Une utilisatiion bien faite de ceux ci se récèle beaucoup plus puissante qu'un positionnement absolu en terme d'organisation et surtout au niveau du redimensionnement de tes fenêtres.

    Pour plus d'infos sur les LayoutManagers inclus dans java: http://java.developpez.com/faq/gui/?...nner_composant
    permetent de bien se faire la main (en particulier le GridBagLayout qui est le plus complexe, et donc le plus flexible, d'entre eux, et est majoritairement destiné à réaliser des formulaires)

    Tu pourras éventuellement par la suite te rediriger vers un LayoutManager non standard (genre FormLayout, GroupLayout, TableLayout, ZoneLayout...)

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

Discussions similaires

  1. Création de composants graphiques perso
    Par Invité dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 15/04/2013, 13h52
  2. Réponses: 4
    Dernier message: 07/04/2010, 18h38
  3. [AS2] Problème avec ComboBox lors création d'un composant perso
    Par aldo-tlse dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 24/05/2006, 18h51
  4. Création de composants graphiques perso Visual C++
    Par jacques_henry dans le forum MFC
    Réponses: 1
    Dernier message: 06/01/2006, 11h40
  5. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58

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