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 :

Autres questions de débutant : graphisme


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut Autres questions de débutant : graphisme
    Bonjour a tous et bonne année 2017, avec pleins de projets, informatiques ou autres...

    Je continue ma formation et j'ai pris comme exercice de faire l'histogramme qui est proposé sur ce site. Je n'ai pas envie de regarder le corrigé donc je vais poser mes questions ici.

    J'ai fait une classe Baton2D avec une méthode afficher(graphics g) et une classe RepereOrtho qui a aussi une méthode afficher(graphics g). L'argument est passé par la méthode paint de mon Jpanel.

    Voilà mon code qui devrait marcher et qui ne trace rien, j'ai donc des instructions qui ne font rien, pas d'erreur mais pas de trace, c'est usant, je ne sais pas dans quel sens chercher. Donc voilà
    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
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Histogramme extends JPanel {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private static int LARGEUR = 600 ;
        private static int HAUTEUR = 400 ;
        ArrayList<Baton2D> mesbatons = new ArrayList<Baton2D>() ;
        
        Baton2D baton = new Baton2D(12,10,Color.RED) ;
        RepereOrtho repere = new RepereOrtho(5,HAUTEUR-5,LARGEUR,HAUTEUR);
        
        public void paint(Graphics g) {
            super.paint(g);
            repere.afficher(g);
        }
        //mesbatons.add(baton) ;  // Alors pourquoi j'ai pas le droit de le faire ?
        
        
        public static void main(String[] args) {
            JFrame mafenetre = new JFrame("Histogramme") ;
             
            JPanel panneau = new JPanel();        
            mafenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             
            
            
            panneau.setBackground(Color.WHITE) ; // Pourquoi le fond ne passe pas en blanc ?
            mafenetre.setLocation(200, 200);
            mafenetre.setSize(LARGEUR,HAUTEUR);
            Histogramme histo = new Histogramme() ;  // et pourquoi y a rien qui s'afficher
            
            mafenetre.setVisible(true);
        }
    }
    class RepereOrtho {
        private int Xorig,Yorig ;
        private int larg,haut ;
        RepereOrtho(int Xo,int Yo, int largeur,int hauteur){
            this.Xorig = Xo ;
            this.Yorig = Yo ;
            this.larg = largeur ;
            this.haut = hauteur ;
        }
        void afficher(Graphics g) {
            g.setColor(Color.BLACK);
            //g.drawLine(Xorig, Yorig, Xorig, larg);
            //g.drawLine(Xorig, Yorig, haut, Yorig);
            g.drawLine(10, 10, 100, 100) ;
            System.out.println("ici");
        }
    }
    class Baton2D {
        private int taille, largeur ;
        private Color couleur ;
        Baton2D (int taille, int largeur,Color couleur) {
            this.taille = taille ;
            this.largeur = largeur ;
            this.couleur = couleur ;
        }
        int getTaille() {
            return this.taille ;
        }
        int getlargeur() {
            return this.largeur ;
        }
        Color getcouleur() {
            return this.couleur ;
        }
        void afficher(Graphics g) {
            g.setColor(couleur);
            g.fillRect(0, 0, 10, 50) ;
        }
    }
    Merci d'avance !!!

  2. #2
    Membre habitué
    Homme Profil pro
    Autodidacte
    Inscrit en
    Décembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Décembre 2016
    Messages : 12
    Par défaut
    Pour le fond blanc c'est parce que tu n'as pas ajouter le panneau dont tu peins le fond en blanc a ta fenêtre via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafenetre.add(panneau);
    Pour le reste, n'ayant pas encore appris a me servie de grapichs g, je suis encore trop débutant pour te répondre.


    Par curiosité: Tu as finis ce tuto: http://java.developpez.com/livres-co...s/javaenfants/ ?

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Citation Envoyé par SeniorEric Voir le message
      //mesbatons.add(baton) ; Alors pourquoi j'ai pas le droit de le faire ?
      Parce qu'on ne peut mettre de telles instructions que dans le corps d'une méthode. Dans le corps d'une classe, ne ne peut mettre que des déclarations (de variables, de méthodes, de classes). Les déclarations de variables peuvent être accompagnées d'une initialisation, mais aucune initialisation, ni aucune instruction void (ne retournant pas de valeur) à fortiori ne peut être mise toute seule.
      Pour résoudre ton problème, tu peux par exemple :
      1. initialiser ta liste de batons dans le constructeur :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        public Histogramme() {
           batons.add( new Baton2D(12,10,Color.RED) );
        }
      2. passer par l'initialisation :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ArrayList<Baton2D> mesbatons = Arrays.asList( new Baton2D(12,10,Color.RED) ) ;
      3. Faire une méthode :
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        public void addBaton(int taille, int largeur,Color couleur) {
           addBaton(new Baton2D(taille, largeur, couleur);
        }
        public void addBaton(Baton2D baton) {
           mesBatons.add(baton);
        }
        Dans la cadre d'un histogramme, on veut pouvoir afficher plusieurs valeurs en batons, cohérente : il faudra donc plutôt faire une méthode du genre setSerie(Valeurs valeurs), qui permet de passer plusieurs valeurs/couleurs, et que cette méthode vide la liste de batons puis y ajoute les nouveaux batons à partir de ces valeurs.
    2. Citation Envoyé par SeniorEric Voir le message
      panneau.setBackground(Color.WHITE) ; Pourquoi le fond ne passe pas en blanc ?
      Parce que le panneau panneau n'est pas affiché : il ne suffit pas de créer un JPanel pour qu'il s'affiche, il faut le mettre dans une fenêtre visible. Mais procéder comme ça pour mettre ton fond en blanc va te compliquer la vie, parce que ce que tu veux afficher c'est un histogramme sur fond blanc, donc en créant un panneau blanc, et un histogramme à côté, il va falloir que tu ajoutes 2 panneaux à la fenêtre, et faire qu'ils soient superposés, que le fond de l'histogramme soit transparent, et qu'il soit au-dessus du panneau. On pourrait utilser un OverlayLayout et faire setOpaque(false) sur Histogramme, mais il est bien plus simple d'affecter le blanc au fond de l'instance d'Histogramme.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
       
      // inutile
      //JPanel panneau = new JPanel(); 
      //panneau.setBackground(Color.WHITE) ; // Pourquoi le fond ne passe pas en blanc ?
              Histogramme histo = new Histogramme() ;  
              histo.setBackground(Color.WHITE)
    3. Citation Envoyé par SeniorEric Voir le message
      Histogramme histo = new Histogramme() ;
      et pourquoi y a rien qui s'afficher
      Comme je le disais précédemment, il faut mettre les composants à afficher dans une fenêtre. Leur position et leur taille sont gérées par un gestionnaire d'agencement (Layout Manager) : on peut s'en passer et gérer les positions et tailels à la main, mais il est préférable de ne pas le faire. Une fenêtre de type JFrame est composée de plusieurs couches dont une est prévue pour le contenu : le content pane. Le Layout Manager du content pane est par défaut un BorderLayout. Pour mettre du contenu dans une fenêtre, on peut donc remplacer le content pane par son propre panel, ou alors mettre les composants dans le content pane existant, layouté par un BorderLayout donc (méthode que je préfère personnellement). Pour ajouter un composant dans le content pane, on peut soit faire :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      frame.getContentPane().add( composant, contrainte );
      soit utiliser le raccourci
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      frame.add( composant, contrainte );
      qui fait la même chose
      contraint étant une valeur qui dépend du Layout Manager.
      Pour mettre l'histogramme dans la zone principale, soit au centre du BorderLayout on fera,
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      mafenetre.add( histo, BorderLayout.CENTER );
      Comme il existe une contrainte par défaut dans le BorderLayout et que cette contrainte est justement BorderLayout.CENTER, on peut écrire plus simplement :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      mafenetre.add( histo );
    4. parce que Swing préfère ne pas traiter le layout automatiquement lorsqu'on ajoute un composant (parce qu'on pourrait en ajouter plusieurs et que le layout peut être couteux en temps, il vaut mieux faire ces ajouts avant de rendre visible la fenêtre, sinon on est obligé de dire à la fenêtre qu'on a changé son contenu pour que le composant affiché soit visible correctement (ce qu'on fera par appel de revalidate() et éventuellement repaint().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    Citation Envoyé par Seloa Voir le message
    Pour le fond blanc c'est parce que tu n'as pas ajouter le panneau dont tu peins le fond en blanc a ta fenêtre via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mafenetre.add(panneau);
    Pour le reste, n'ayant pas encore appris a me servie de grapichs g, je suis encore trop débutant pour te répondre.


    Par curiosité: Tu as finis ce tuto: http://java.developpez.com/livres-co...s/javaenfants/ ?
    Merci et pas mal pour un débutant. Pour le tuto, non je ne l'avais pas lu mais je vais le faire....:-)

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    Le 1 OK j'ai compris 5/5.
    Le 2 et 3 : je crois que je ne comprends pas bien ce qu'est un JPanel par rapport à une Jframe et par rapport à un composant type bouton.

    La JFrame c'est la fenetre, mais est ce obligatoire pour tracer des formes ? Dans cet exemple, il n"ouvre pas de JFrame : http://duj.developpez.com/tutoriels/java/dessin/intro/
    et pour mettre des boutons par exemple, il faut un JFrame, un JPanel et ajouter les boutons au Jpanel.

    Ce que j'ai du mal à trouver c'est le référence manual. On trouve plein d'exemples qui tracent des formes, mais les approches sont souvent différentes.

    Pour l'instant j'ai tracé les axes, mais j'ai perdu le fond blanc dés que j'ai rajouté histo au borderlayout de mafenetre.

    Et puis encore merci pour ton aide

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu as 2 types de composants :
    1. des composants. Par exemple JButton, JList, JCheckBox...
    2. des conteneurs. Les conteneurs sont des composants qui peuvent contenir des composants (donc des JButton, JList, JCheckbox, mais aussi des conteneurs). Par exemple JPanel,

    Pour pouvoir être affichés, les composants doivent être mis dans des fenêtres, des ensembles complexes de conteneurs, qui sont associé à une fenêtre système. Par exemple, JFrame, JInternalFrame...
    En général, dans le système, une fenêtre est un sous-espace de l'écran avec des trucs dedans. Pour pouvoir faire facilement beaucoup de choses, la fenêtre Swing est composée de différentes couche. Une pour le fond par exeple, avec le titre, les boutons de fermeture, de menu de fenêtre, l'icône, etc. (Voir la structure de couches ici). Une couche est prévue pour le contenu : les champs de ton formulaire, les boutons tout ça. Cette couche est constitué de ce qu'on appel le "content pane" (le panneau de contenu) : c'est lui qui va contenir ce qui est à l'intérieur de la zone de la fenêtre qui est comprise en dessous du titre et entre les bordures. En bref, la partie spécifique de ton dialogue. Le content pane est une sorte de JPanel préparamétré. Donc tu peux le considérer comme un JPanel : soit tu le remplaces par le tiens, soit tu y mets le composants que tu veux (personnellement je préfère cette second option, pour ne pas dénaturer le content pane par défaut). La barre de menu va être dans un layered pane, pour ne pas interférer avec le contenu, ou les bordures. On affichera les fenêtres de type popup dans un layered pane pour ne pas interférer avec le reste des composants de la fenêtre, etc.
    Le "content pane" c'est un moyen de distinguer la partie dite de décoration de la fenêtre (titre, boutons de fermeture, bordures...), d'autres éléments (les popups, ce qui sert au drag and drop, etc.) et la partie utile (son contenu). Par exemple, on peut faire des fenêtres qui contiennent des fenêtres en remplaçant le content pane par défaut par un JDesktopPane, un "content pane" plus complexe qu'un JPanel qui va pouvoir contenir des JInternalFrame, des conteneurs qui ressemblent à des JFrame, ce qui permet d'avoir des fenêtres dans des fenêtres.

    Pour commencer simplement, toi, tu n'as qu'à te préoccuper du contenu : donc ajouter des composants dans le content pane. Pour te simplifier encore plus, considère que tu fais ton interface dans un JPanel (un conteneur donc) et ajoute simplement ce panel dans le content pane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JFrame frame = new JFrame("Une fenêtre");
     
    frame.add( createContent() );
     
    frame.setVisible(true);
    et
    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
    JPanel createContent() {
     
        JPanel panel = new JPanel();
     
        // tu affectes un layout manager en fonction de tes besoins
        panel.setLayout(new BorderLayout());
     
        // ici tu ajoutes tes composants
     
        // par exemple, en bas, un panel avec des boutons
        JPanel buttonPanel = new JPanel(); // un panneau pour contenir des boutons
        JButton boutonSave = new JButton("Save");
        buttonPanel.add( boutonSave ); // on ajoute le bouton save
        JButton boutonQuit = new JButton("Quit");
        buttonPanel.add( boutonQuit ); // on ajoute le bouton quit
        panel.add(buttonPanel, BorderLayout.SOUTH); // on met le panel de boutons en bas de la fenêtre
     
        // une liste scrollable
        String[] values = Stream.iterate(1, v->++v).limit(100).map(v->"Valeur "+v).toArray(String[]::new); // Valeur 1, Valeur 2...Valeur 100
        JList<String> jlist = new JList<>(values);
        panel.add(new JScrollPane( jlist ), BorderLayout.CENTER); // on met la liste dans un JScrollPane dans le centre de la fenêtre
     
        return panel;
     
     
    }

    Ce qui donne :
    Nom : Capture.PNG
Affichages : 195
Taille : 4,6 Ko

    Snippet complet :
    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
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.util.stream.Stream;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
     
    public class ExempleFenetre {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.add( createContent() );
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public static JComponent createContent() {
    		JPanel panel = new JPanel();
     
    	    // tu affectes un layout manager en fonction de tes besoins
    	    panel.setLayout(new BorderLayout());
     
    	    // ici tu ajoutes tes composants
     
    	    // par exemple, en bas, un panel avec des boutons
    	    JPanel buttonPanel = new JPanel(); // un panneau pour contenir des boutons
    	    JButton boutonSave = new JButton("Save");
    	    buttonPanel.add( boutonSave ); // on ajoute le bouton save
    	    JButton boutonQuit = new JButton("Quit");
    	    buttonPanel.add( boutonQuit ); // on ajoute le bouton quit
    	    panel.add(buttonPanel, BorderLayout.SOUTH); // on met le panel de boutons en bas de la fenêtre
     
    	    // une liste scrollable
    	    String[] values = Stream.iterate(1, v->++v).limit(100).map(v->"Valeur "+v).toArray(String[]::new); // Valeur 1, Valeur 2...Valeur 100
    	    JList<String> jlist = new JList<>(values);
    	    panel.add(new JScrollPane( jlist ), BorderLayout.CENTER); // on met la liste dans un JScrollPane dans le centre de la fenêtre
     
    	    return panel;
    	}	
    }


    Citation Envoyé par SeniorEric Voir le message
    Dans cet exemple, il n"ouvre pas de JFrame : http://duj.developpez.com/tutoriels/java/dessin/intro/
    et pour mettre des boutons par exemple, il faut un JFrame, un JPanel et ajouter les boutons au Jpanel.
    Dans ce tutoriel, on explique comment dessiner en Java 2D (introduction pour débutant) : on se concentre donc sur l'aspect dessin, en utilisant un composant dédié JCanvas, étendant JPanel. Mais pour l'afficher, l'exemple utilise bien une JFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void showOnFrame(JComponent component, String frameName) {
    		JFrame frame = new JFrame(frameName);
    		WindowAdapter wa = new WindowAdapter() {
    			public void windowClosing(WindowEvent e) {
    				System.exit(0);
    			}
    		};
    		frame.addWindowListener(wa);
    		frame.getContentPane().add(component);
    		frame.pack();
    		frame.setVisible(true);
    	}
    Ceci est un code générique qui permet d'affichage n'importe quel composant Swing (étendant JComponent) dans une JFrame. On pourrait utiliser ce code pour afficher mon exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GUIHelper.showOnFrame(ExempleFenetre.createContent(), "Démo");
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    Bon, je comprends un peu mieux. Mais là, mon problème n'est plus graphique, mon ArrayList<Baton2D> ne se remplit pas, alors que j'ai fait des add dans le constructeur de histogramme, je ne comprends pas...

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Histogramme extends JPanel {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private static int LARGEUR = 600 ;
    	private static int HAUTEUR = 400 ;
    	public ArrayList<Baton2D> mesbatons = new ArrayList<Baton2D>() ;
    	
        RepereOrtho repere = new RepereOrtho(5,HAUTEUR-45,LARGEUR,HAUTEUR);
    	
        public void paint(Graphics g) {
        	super.paint(g);
    		repere.afficher(g);
    		System.out.println("Dans paint "+mesbatons.size());  // là il indique 0, le tableau est vide ... du coup il n'affiche rien
    		for (Baton2D baton : mesbatons) {
    			System.out.println("dans paint pour chaque baton "+baton.getTaille()+" "+baton.getLargeur()+" "+baton.getCouleur());
    			baton.afficher(g) ;
    		}
    	}
    	
        public void histogramme() {
        	Baton2D baton1 = new Baton2D(12,10,Color.RED) ;
        	mesbatons.add(baton1) ;
        	Baton2D baton2 = new Baton2D(10,10,Color.GREEN) ;
        	mesbatons.add(baton2) ;
        	Baton2D baton3 = new Baton2D(17,10,Color.BLUE) ;
        	mesbatons.add(baton3) ;
        	Baton2D baton4 = new Baton2D(5,10,Color.YELLOW) ;
        	mesbatons.add(baton4) ;
        	Baton2D baton5 = new Baton2D(13,10,Color.MAGENTA) ;
        	mesbatons.add(baton5) ;
        	Baton2D baton6 = new Baton2D(13,10,Color.CYAN) ;
        	mesbatons.add(baton6) ;
        	System.out.println("Dans histogramme "+mesbatons.size());
        }
    	public static void main(String[] args) {
    		JFrame mafenetre = new JFrame("Histogramme") ;
    		 
    		JPanel panneau = new JPanel();		
    		mafenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		mafenetre.add(panneau) ;
    		mafenetre.setLocation(200, 200);
    		mafenetre.setSize(LARGEUR,HAUTEUR);
    		Histogramme histo = new Histogramme() ;
    		mafenetre.setBackground(Color.WHITE) ;
    		//panneau.setBackground(Color.WHITE) ;
    		mafenetre.add( histo, BorderLayout.CENTER );
    		panneau.setBackground(Color.WHITE) ;
    		mafenetre.setResizable(false);
    		mafenetre.setVisible(true);
    		
    		
    	}
    }
    class RepereOrtho {
    	private int Xorig,Yorig ;
    	private int larg,haut ;
    	RepereOrtho(int Xo,int Yo, int largeur,int hauteur){
    		this.Xorig = Xo ;
    		this.Yorig = Yo ;
    		this.larg = largeur ;
    		this.haut = hauteur ;
    	}
    	void afficher(Graphics g) {
    		g.setColor(Color.BLACK);
    		g.drawLine(Xorig, Yorig, Xorig, 5);
    		g.drawLine(Xorig, Yorig, larg-10, Yorig);
    		System.out.println("dans afficher de repere "+Xorig+" "+Yorig+" "+larg+" "+haut);
    		//g.drawLine(10, 10, 100, 100) ;
    		//System.out.println("ici");
    	}
    }
    class Baton2D {
    	private int taille, largeur ;
    	private Color couleur ;
    	Baton2D (int taille, int largeur,Color couleur) {
    		this.taille = taille ;
    		this.largeur = largeur ;
    		this.couleur = couleur ;
    	}
    	int getTaille() {
    		return this.taille ;
    	}
    	int getLargeur() {
    		return this.largeur ;
    	}
    	Color getCouleur() {
    		return this.couleur ;
    	}
    	void afficher(Graphics g) {
    		g.setColor(couleur);
    		System.out.println("dans afficher de baton "+taille+" "+largeur+" "+couleur);
    		g.fillRect(0, 0, 10, 50) ;
    	}
    }

    on dirait qu'il ne passe pas dans le constructeur ...!!

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    public void histogramme() {...} est une méthode qui n'est jamais appelée, donc jamais exécutée.

    Soit tu l'appelles explicitement, soit tu mets le code dans le constructeur comme je t'ai dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Histogramme() {
     
        	Baton2D baton1 = new Baton2D(12,10,Color.RED) ;
        	mesbatons.add(baton1) ;
            /*... etc ...*/
    }
    Ce code sera exécutée lors du new Histogramme();.

    Par ailleurs, je te l'ai déjà dit, enlève le mafenetre.add(panneau); : le add() ici ajoute par défaut en BorderLayout.CENTER, et un BorderLayout ne sait gérer qu'un seul composant en son centre. Comme tu mets ensuite histo au centre, ça fait 2 composants et donc un risque d'avoir n'importe quoi au résultat (ça peut afficher ce que tu veux, comme ça peut afficher autre chose).

    Je te laisse découvrir les autres problèmes que tu vas voir après cette correction...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    j'avais mis void pour le constructeur et j'avais oublié la majuscule, ça fait beaucoup. J'ai enlevé le mafenetre.add(panneau), mais le fond est tjrs gris.
    Pour les autres problèmes, j'ai vu, mais maintenant il faut que je code comment les afficher (les batons) correctement. Mais paintenant je peux tester quelque chose. MERCI !

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    j'avais mis void pour le constructeur et j'avais oublié la majuscule, ça fait beaucoup. J'ai enlevé le mafenetre.add(panneau), mais le fond est tjrs gris.
    Pour que histo soit blanc, il suffit de dire que tu veux qu'il soit blanc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Histogramme histo = new Histogramme() ; // créer le JPanel Histogramme
    histo.setBackground(Color.WHITE); // dire que son fond est blanc
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    il me semblait que j'avais déjà essayé le histo.setBackground(Color). Bon donc j'arrive à un truc pas mal, mais il me manque le petit nombre au dessus du baton. Et j'ai peut ^etre un problème de conception. La seule façon d'écrire, c'est le JLabel ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    j'ai trouvé g.drawString, donc ça va aller...

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    la classe Graphics a une méthode drawString() pour écrire dans le contexte graphique. La difficulté c'est le placement. En x, pas trop de souci, c'est des mathématiques de base (pour centrer en particulier). Pour le y, c'est plus compliqué, parce qu'en typographie, on trace un texte sur une baseline, et le y c'est celui de la baseline. Il faut donc pouvoir déterminer la position de la baseline.
    Dans ton cas, avec des coordonnées de baton en dur, on peut procéder en dur, à tatons, en essayant différentes valeurs jusqu'à ce que ça soit satisfaisant.

    Dans ta méthode, afficher() de Baton2D, tu connais la hauteur du baton, donc le y correspondant, donc tu peux faire ce y moins quelque chose pour afficher le texte au-dessus du baton... En revanche, si tu veux afficher le texte au centre du baton, ce sera justement plus compliqué.

    Bien sûr, en théorie, il faudrait plutôt penser en relatif, pour pouvoir afficher autant de batons qu'on veut sans avoir à modifier tout le code à chaque fois, y compris si on veut changer la taille de la fenêtre. Si tu veux faire évoluer ton code pour que l'histogramme s'adapte à la taille de la fenêtre, et qu'il fonctionne tout seul quelque soit le nombre de batons, on verra à ce moment, et je te donnerai plus d'informations à ce sujet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    oui bien sur on peut améliorer avec gestion de l'échelle en dynamique, et suivant la taille de la fenetre, faire du plus dynamique. Bon donc c'est fait :

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.ArrayList;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
    public class Histogramme extends JPanel {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private static int LARGEUR = 800 ;
    	private static int HAUTEUR = 600 ;
    	public ArrayList<Baton2D> mesbatons = new ArrayList<Baton2D>() ;
     
        RepereOrtho repere = new RepereOrtho(5,HAUTEUR-45,LARGEUR,HAUTEUR);
     
        public void paint(Graphics g) {
        	int nouvX = 10 ;
        	super.paint(g);
    		repere.afficher(g);
     
    		for (Baton2D baton : mesbatons) {
    			baton.afficher(g,nouvX,HAUTEUR-45) ;
    			nouvX = nouvX + 4 * baton.getLargeur() + 10 ;
    		}
    	}
     
        public Histogramme() {
        	Baton2D baton1 = new Baton2D(12,10,Color.RED) ;
        	mesbatons.add(baton1) ;
        	Baton2D baton2 = new Baton2D(10,10,Color.GREEN) ;
        	mesbatons.add(baton2) ;
        	Baton2D baton3 = new Baton2D(17,10,Color.BLUE) ;
        	mesbatons.add(baton3) ;
        	Baton2D baton4 = new Baton2D(5,10,Color.YELLOW) ;
        	mesbatons.add(baton4) ;
        	Baton2D baton5 = new Baton2D(13,10,Color.MAGENTA) ;
        	mesbatons.add(baton5) ;
        	Baton2D baton6 = new Baton2D(8,10,Color.CYAN) ;
        	mesbatons.add(baton6) ;
        }
    	public static void main(String[] args) {
    		JFrame mafenetre = new JFrame("Histogramme") ;
     
    		JPanel panneau = new JPanel();		
    		mafenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		mafenetre.setLocation(200, 200);
    		mafenetre.setSize(LARGEUR,HAUTEUR);
    		Histogramme histo = new Histogramme() ;
    		histo.setBackground(Color.WHITE) ;
    		mafenetre.add( histo, BorderLayout.CENTER );
    		panneau.setBackground(Color.WHITE) ;
    		mafenetre.setResizable(false);
    		mafenetre.setVisible(true);
     
     
    	}
    }
    class RepereOrtho {
    	private int Xorig,Yorig ;
    	private int larg,haut ;
    	RepereOrtho(int Xo,int Yo, int largeur,int hauteur){
    		this.Xorig = Xo ;
    		this.Yorig = Yo ;
    		this.larg = largeur ;
    		this.haut = hauteur ;
    	}
    	void afficher(Graphics g) {
    		g.setColor(Color.BLACK);
    		g.drawLine(Xorig, Yorig, Xorig, 5); // Trait vertical
    		g.drawLine(Xorig, Yorig, larg-10, Yorig); // Trait Horizontal 
    	}
    }
    class Baton2D {
    	private int taille, largeur ;
    	private Color couleur ;
    	Baton2D (int taille, int largeur,Color couleur) {
    		this.taille = taille ;
    		this.largeur = largeur ;
    		this.couleur = couleur ;
    	}
    	int getTaille() {
    		return this.taille ;
    	}
    	int getLargeur() {
    		return this.largeur ;
    	}
    	Color getCouleur() {
    		return this.couleur ;
    	}
    	void afficher(Graphics g,int _x,int hauteur_fenetre) {
    		int hauteur = taille * 20 ;
    		int y_corner = hauteur_fenetre - 5 - hauteur ;
    		g.setColor(couleur);
    		g.fillRect(_x, y_corner, 4*largeur, hauteur) ;
    		g.setColor(Color.BLACK);
    		g.drawString(String.valueOf(taille), _x+10, y_corner-5) ;
    	}
    }
    Maintenant, je m'attaque au 2ème exo, le colorchooser, je vais voir si je peux ouvrir une fenetre avec un boutons au milieu. 'vous marrez pas, c'est pas drole...

  15. #15
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    je n'en reviens pas moi m^eme, j'ai tenté ma chance sur le search du site sur javadoc, qui m'a amené à showdialog de JColorChooser, et les conseils que tu m'as donné et voilà

    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JColorChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    class FenCouleur extends JPanel implements ActionListener {
    	private Color couleurdefond ;
     
    	FenCouleur(Color couleur) {
    		this.couleurdefond = couleur ;
    		setLayout(new FlowLayout());
    		JButton changerCouleur = new JButton("Changer Couleur");
    		add( changerCouleur );
    		changerCouleur.addActionListener(this);
    		setBackground(couleur) ;
    	}
    	public void actionPerformed(ActionEvent e) {
    		Color nouvellecouleur = JColorChooser.showDialog(this, "Choissez une couleur", couleurdefond) ;
    		if (nouvellecouleur != null) 
    			{
    				this.couleurdefond = nouvellecouleur ;
    				setBackground(this.couleurdefond) ;
    			}
    		else return ;
    		// TODO Auto-generated method stub
     
    	}
     
    }
     
    public class FenetreCouleur {
     
    	public static void main(String[] args) {
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Changer la couleur du fond");
    		JPanel panel = new FenCouleur(couleur) ;
     
    		frame.add(panel) ;
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(false) ;
    		frame.setVisible(true);
     
    	}
    }
    C'est bien ? je demande pas un susucre, mais si c'est correctement codé...

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est pas trop mal pour un débutant. Mais je n'aurais pas mis le bouton dans le panneau "coloré", mais en dehors.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  17. #17
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    Salut !

    je continue mon training et là il faut tracer des disques de diametre et couleur aleatoires toutes les 2 secondes par exemple. J'ai vu qu'il fallait appeler une instance de timer et définir une timertask. Et c'est là le problème, je fais ça dans la méthode paint de JPanel, mais je n'arrive pas à passer des arguments, genre Graphics g et de toute façons je ne trouve pas ça très propre...

    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
    	public void paint(Graphics g) {
     
    		 long temps = 2000;                      // délai avant de répéter la tache : 2000 = 2  seconde
    	     long startTime = 0;                    // délai avant la mise en route (0 demarre immediatement)
    	     Timer timer = new Timer();             // création du timer
    	     TimerTask tache = new TimerTask() {     // création et spécification de la tache à effectuer
    	         @Override
    	         public void run() {
     
    	            //Random randomno = new Random();
    	            //int toto = randomno.nextInt(100);
    	            //System.out.println("salut"+ toto);    // ici se qui doit être effectué
    	            System.out.println("salut");         
    	         }
    	     };
    	     timer.scheduleAtFixedRate(tache,startTime,temps);  // ici on lance la mecanique
    		 /*int diametre = randomno.nextInt(150);
    		 int abscisse = randomno.nextInt(600);
    		 int ordonnee = randomno.nextInt(400);
    		 int rcolor = randomno.nextInt(255);
    		 int gcolor = randomno.nextInt(255);
    		 int bcolor = randomno.nextInt(255);
    		 super.paint(g);
    		 g.setColor(new Color(rcolor,gcolor,bcolor)) ;
    		 g.fillOval(abscisse, ordonnee, diametre, diametre) ;
    		 g.dispose() ; */
    	}
    comment je peux passer tout ce qui est en commentaire à l'intérieur de run() ?

    et que fait g.dispose() ?
    Dans l'état actuel, ça m'affiche salut par salves de 3 toutes les 2 secondes. Pourquoi 3 et pas une fois ?
    EDIT : en fait c'est le timer de swing qu'il faut utiliser mais je gueunille avec le actiontimer donc j'ai trouvé un exemple avec le java.utils.timer que j'ai essayé d'implémenter...mais bon j'ai toujours le problème de passage de paramétres

    Merci d'avance

  18. #18
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Premièrement, il ne faut surtout pas démarrer les tâches planifiées dans la méthode paint() : tu ne contrôles absolument pas quand elle sera invoquée, ni combien de fois, donc tu risques de déclencher trop de tâches, mais surtout, ces tâches impliquant un rafraîchissement de l'affichage, ça va appele paint() donc redéclencher la programmation des tâches, qui s'exécuteront, donc redemanderons un redessin, donc reprogrammeront des tâches, etc... indéfiniment.

    Ensuite, on peut réaliser ça avec un timer java.util (par certains aspects, il vaudrait mieux), mais il faut gérer de manière très minutieuse les synchronisations (les sémaphores) pour éviter les accès concurrents. Ce sera plus simple avec un timer Swing, bien qu'on bloque légèrement l'EDT pour générer les cercles. Disons que commencer par le faire sur timer Swing, puis ensuite l'adapter sur timer non Swing (timer java.util, ou service d'exécution (ScheduledExecutorService)).

    Ensuite, la manière la plus simple de le réaliser, bien que légèrement bloquante pour Swing est de générer simplement les cercles dans la méthode paint, et que le timer fasse simplement des repaint(). Avec cette méthode, tu peux utiliser un Timer java.util sans souci (repaint() ne s'exécute pas dans l'EDT).


    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
    public class DemoCircles extends JPanel {
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		final Random random = ThreadLocalRandom.current();
    		final int nbCircles = 3+random.nextInt(20);
    		final int width=getWidth();
    		final int height=getHeight();
    		for(int i=0; i<nbCircles; i++) {
    			final int diam = random.nextInt(Math.min(width,height));
    			final int x = random.nextInt(width-diam);
    			final int y = random.nextInt(height-diam);
    			g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    			g.drawOval(x, y, diam, diam);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		final ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DemoCircles panel = new DemoCircles();
     
    		frame.add(panel);
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowOpened(WindowEvent e) {
    				service.scheduleAtFixedRate(()-> panel.repaint(), 0, 2, TimeUnit.SECONDS);
    			}
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				service.shutdownNow();
    			}
     
    		});
     
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	} 
     
    }


    Mais cette méthode a un défaut : si un rafraichissement est demandé (par exemple, si on redimensionne la fenêtre), on génère aussi de nouveaux cercles, donc on a plus l'effect désiré de regénérer des cercles toutes les 2 secondes. Pour éviter ça, il faut stocker les cercles quelque part, et ne générer cette liste périodiquement.


    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
    public class DemoCircles extends JPanel {
     
    	private volatile ColoredCircle[] circles = new ColoredCircle[0];
     
    	public void generate() {
    		final Random random = ThreadLocalRandom.current();
    		final int nbCircles = 3+random.nextInt(20);
    		ColoredCircle[] coloredCircles = new ColoredCircle[nbCircles];
    		final int width=getWidth();
    		final int height=getHeight();
    		for(int i=0; i<nbCircles; i++) {
    			final int diam = random.nextInt(Math.min(width,height));
    			final int x = random.nextInt(width-diam);
    			final int y = random.nextInt(height-diam);
    			coloredCircles[i] = new ColoredCircle(x, y, diam, new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
    		}
    		circles = coloredCircles;
    		repaint();
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		for(ColoredCircle circle : circles) {
    			circle.draw(g);
    		}
    	}
     
    	private static class ColoredCircle {
     
    		private int x;
    		private int y;
    		private int diam;
    		private Color color;
     
    		public ColoredCircle(int x, int y, int diam, Color color) {
    			this.x=x;
    			this.y=y;
    			this.diam=diam;
    			this.color=color;
    		}
     
    		public void draw(Graphics g) {
    			g.setColor(color);
    			g.drawOval(x, y, diam, diam);
    		}
     
    	}
     
    	public static void main(String[] args) {
     
    		final ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		DemoCircles panel = new DemoCircles();
     
    		frame.add(panel);
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowOpened(WindowEvent e) {
    				service.scheduleAtFixedRate(()-> panel.generate(), 0, 2, TimeUnit.SECONDS);
    			}
     
    			@Override
    			public void windowClosed(WindowEvent e) {
    				service.shutdownNow();
    			}
     
    		});
     
     
    		frame.setSize(400, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	} 
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  19. #19
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Par défaut
    j'aurais vraiment pas sorti ça tout seul. C'est quoi cette syntaxe ligne 34 avec la flèche? Je ne connais pas, et ça compile pas
    et c'est quoi la difference entre paint et paintcomponent stp ?

  20. #20
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    j'aurais vraiment pas sorti ça tout seul. C'est quoi cette syntaxe ligne 34 avec la flèche?
    Tu parles de cette ligne je suppose service.scheduleAtFixedRate(()-> panel.repaint(), 0, 2, TimeUnit.SECONDS);C'est une expression lambda : elle permet d'éviter d'implémenter une interface fonctionnelle (une interface qui n'a qu'une seule méthode).
    Cette ligne est l'équivalent de (ici utilisation d'une classe anonyme implémentant l'interface fonctionnelle Runnable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    service.scheduleAtFixedRate(new Runnable() {
           public void run() {
               panel.repaint();
           }
    }, 0, 2, TimeUnit.SECONDS);
    Citation Envoyé par SeniorEric Voir le message
    Je ne connais pas, et ça compile pas
    Ça ne compile qu'en Java 8.

    Citation Envoyé par SeniorEric Voir le message
    et c'est quoi la difference entre paint et paintcomponent stp ?
    paintComponent est une méthode appelée par paint, elle est chargée plus spécifiquement de peindre le composant lui-même (pas ce qui se trouve de dedans). Cela ne change pas grand chose lorsqu'il n'y a pas de composants dans le panel.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [Python 3.X] Question de débutant : Problème de classes dans un autre fichier
    Par amelyfred dans le forum Général Python
    Réponses: 4
    Dernier message: 17/06/2015, 12h00
  2. Réponses: 3
    Dernier message: 10/04/2014, 17h12
  3. freeze de la GUI et autres questions débutantes
    Par chaima01 dans le forum Débuter
    Réponses: 1
    Dernier message: 30/04/2013, 19h54
  4. [Débutant] Autre question sur Const
    Par Faiche dans le forum Débuter
    Réponses: 9
    Dernier message: 21/10/2008, 14h08
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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