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. #21
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    Je suis en java 8 apparemment et le compilo grogne sur les parenthèses avant la flèche.

    Pour revenir au timer, est ce qu'il y a l'équivalent d'un sleep ? J'ai vu Thread.sleep mais c'est pas ce que je veux.

    Ce que je pensais faire c'est u cercle toutes les 2 secondes, j'imaginais un cercle, sleep 2, un cercle, sleep 2, dans une boucle while true, à l'ancienne quoi !!! :-)

  2. #22
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    Ce coup ci j'ai regardé le corrigé et je suis vert de par sa simplicité. 2 lignes dans le constructeur de la classe public class DisquesRandom extends JFrame implements ActionListener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        // Initialisation du timer. 
     
              this.minuterie = new Timer(100, this); 
     
              this.minuterie.start();
    le disque est tracé dans le paint(), ça je pige ...

    et un repaint dans public void actionPerformed(ActionEvent e).

    Alors qu'est ce qui relie minuterie à actionperformed ? C'est le timer de swing qui marche comme ça ? Ben chapeau !

    Mais ce qui est étrange c'est que quand on redimensionne la fenetre, les disques tracés précédemment ne s'effacent pas comme j'ai l'habitude de voir

    le corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
     
     
        import java.awt.Color; 
     
        import java.awt.Graphics; 
     
        import java.awt.event.ActionEvent; 
     
        import java.awt.event.ActionListener; 
     
     
     
        import javax.swing.JFrame; 
     
        import javax.swing.Timer; 
     
     
     
     
     
     
     
        /** 
     
         * <p>Classe affichant des disques de manière aléatoire.</p> 
     
         * @author Sébastien ESTIENNE. 
     
         */ 
     
        public class DisquesRandom extends JFrame implements ActionListener 
     
        { 
     
           /** 
     
            * <p>Serial version UID.</p> 
     
            */ 
     
           private static final long serialVersionUID = 1L; 
     
     
     
           /** La minuterie pour l'affichage des disques. */ 
     
           private Timer minuterie; 
     
     
     
     
     
           /** 
     
            * <p>Constructeur initialisant la fenêtre.</p> 
     
            */ 
     
           public DisquesRandom() 
     
           { 
     
              super("Disques aléatoires"); 
     
     
     
              // Initialisation du timer. 
     
              this.minuterie = new Timer(100, this); 
     
              this.minuterie.start(); 
     
     
     
              // Propriétés de la fenêtre. 
     
              setLocation(50, 50); 
     
              setSize(400, 300); 
     
              setVisible(true); 
     
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     
           } 
     
     
     
     
     
           /** 
     
            * <p>Dessine la fenêtre.</p> 
     
            * @param g Le contexte graphique utilisé pour dessiner. 
     
            */ 
     
           @Override 
     
           public void paint(Graphics g) 
     
           { 
     
              // Trois nombres aléatoires entre 0 et 255 pour la couleur. 
     
              int r = (int) (Math.random() * 256); 
     
              int v = (int) (Math.random() * 256); 
     
              int b = (int) (Math.random() * 256); 
     
     
     
              // Coordonnées et taille de l'ovale. 
     
              int x = (int) (Math.random() * getWidth()); 
     
              int y = (int) (Math.random() * getHeight()); 
     
              int taille = 10 + (int) (Math.random() * 65); 
     
     
     
              // Dessine le disque. 
     
              g.setColor(new Color(r, v, b)); 
     
              g.fillOval(x, y, taille, taille); 
     
           } 
     
     
     
     
     
           /** 
     
            * Invoqué quand une action se produit. 
     
            * @param e L'événement qui indique qu'une action s'est produite. 
     
            */ 
     
           public void actionPerformed(ActionEvent e) 
     
           { 
     
              repaint(); 
     
           } 
     
     
     
     
     
           /** 
     
            * <p>Commence l'exécution du programme.</p> 
     
            * @param args Les paramètres de la ligne de commande. 
     
            */ 
     
           public static void main(String[] args) 
     
           { 
     
              new DisquesRandom(); 
     
           } 
     
        }

  3. #23
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    En fait les 2 sont aussi simples et foutus pareil finalement. Il y a juste les disques persistants sur le corrigé de l'exo.
    Mais il y a un truc qui m'échappe :
    donc on lie un timer à un windowadapter qui repère les mouvements de fenètre mais la méthode ou il y a le repaint() est appelée m^eme si on ne touche à rien de la fenètre???
    Pourquoi ?

    J'aimerais bien faire un truc similaire ou les disques grossissent doucement. Genre champignons...je vais voir.

    Encore merci pour tes réponses Joel !!!

  4. #24
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    Ce coup ci j'ai regardé le corrigé et je suis vert de par sa simplicité.
    Déjà, il ne trace qu'un seul disques, ça simplifie déjà un peu par rapport à tracer plusieurs cercles ou disques (ce que j'avais compris de ta description). Toutefois je ne trouve pas que l'utilisation de Math.random() simplifie quoique ce soit : je trouve plus simple d'utiiiser random qui permet de tirer des int sans multiplication et sans cast. Enfin, c'est ce que j'appellerais un snippet limité, ou on mélange un peu tout (et qui ouvre la classe en plus - l'implémentation de ActionListener sur la JFrame est très gênante) : reproduire exactement ce code dans un programme qui fait plein d'autres choses obligera à faire des adaptations (légère certe). Cette implémentation est très trompeuse et ce n'est vraiment pas une bonne idée de la présenter dans un tutoriel, parce que ça va donner de mauvaises habitudes, de mauvais réflexes, et justement te faire implémenter des trucs qui ne fonctionneront pas et tu ne comprendras pas pourquoi. Mais ça fonctionne, isolé, tel quel, à quels détails près (comme ce qu'il se passe lors d'un redimensionnement de la fenêtre par exemple, comme tu le soulignes).

    Citation Envoyé par SeniorEric Voir le message
    Alors qu'est ce qui relie minuterie à actionperformed ? C'est le timer de swing qui marche comme ça ? Ben chapeau !
    C'est le this dans this.minuterie = new Timer(100, this);. Il représente la JFrame elle-même, l'instance de DisquesRandom plus exactement dit. Comme DisqueRandom implémente ActionListener, on peut la passer en paramètre au constructeur de Timer, qui appelle la méthode actionPerformed.

    Citation Envoyé par SeniorEric Voir le message
    Mais ce qui est étrange c'est que quand on redimensionne la fenetre, les disques tracés précédemment ne s'effacent pas comme j'ai l'habitude de voir
    Justement, c'est dû au fait que l'implémentation ignore un point important dans Swing : le recyclage du contexte graphique. Avec un raccourci qui est source de soucis pour pas mal de débutant (fait partie des erreurs les plus communes) : la suppression de l'appel sur super.paint(g) dans paint(Graphics g). L'instance de Graphics, ce que j'appelle personnellement un contexte graphique, permet de manipuler une matrice de pixels pour simplifier : donc un espace mémoire. Pour faire des économies de temps et de mémoire, Swing ne crée pas à tout bout de champ des contextes graphiques. Il utilise toujours le même, et ne prend pas la peine de chercher à l'effacer (ce qui prendrait du temps). Il laisse le soin aux composants de faire ça. L'implémentation par défaut de paint() s'occupe de cet effacement (plus exactement, elle le fait en peignant un fond à la fenêtre), et le fait de supprimer l'appel de super.paint() supprime cet effacement, ce qui fait qu'à chaque repaint() on repeint ce qui l'avait été avant. Dans le cadre d'une application plus complexe, avec plusieurs fenêtres, panneaux, boutons, menus, etc, si on fait la même chose, on verra des bouts de composants dans d'autres bouts de composants. L'effet peut être voulu, mais en général, c'est plutôt un problème. Si l'effet est voulu, il y a des moyens beaucoup plus "propres" de le faire : dessiner dans une image par exemple, et afficher l'image dans le fond de son composant.


    Citation Envoyé par SeniorEric Voir le message
    Mais il y a un truc qui m'échappe :
    donc on lie un timer à un windowadapter qui repère les mouvements de fenètre
    Le WindowAdapter "repère" surtout l'ouverture, la fermeture, le passage en icône=l'envoi dans la barre de tâche dans Windows (ou le retour à l'état visible), l'activation/désactivation. Tu pourras détecter mouvement, changement de taille, fenêtre cachée/réaffichée par un ComponentListener/ComponentAdapter.

    Citation Envoyé par SeniorEric Voir le message
    mais la méthode ou il y a le repaint() est appelée m^eme si on ne touche à rien de la fenètre???
    Non, si on touche à rien, à moins d'avoir justement un processus (comme un Timer) qui appelle explicitement un repaint(), la fenêtre ne sera pas repeinte. Il ne faut tout de même pas exclure qu'il puisse y avoir des processus système (ou externe plus généralement) qui pourrait repeindre toutes les fenêtres tout d'un coup, complètement ou partiellement, soit en passant par un appel qui déclenche finalement un "repaint" (ou équivalent) soit par un autre moyen (simplement sauvegarder une copie bitmap de l'écran) : comme on ne peut pas le savoir, à moins d'avoir une connaissance accrue de tout ce qu'il se passe dans la machine, il vaut mieux considérer toujours que paint() (ou paintComponent, ou les autres méthodes simialires) sont toujours capables de dessiner ce qu'on veut afficher, sans se préoccuper de savoir si ça a déjà été fait ou pas, ou si ça le refera, et ce le plus rapidement possible.
    Enfin, il y a des processus particuliers de Swing qui nécessite de redessiner : redimensionnement, layout, etc.

    Citation Envoyé par SeniorEric Voir le message
    J'aimerais bien faire un truc similaire ou les disques grossissent doucement. Genre champignons...je vais voir.
    L'exemple DisquesRandom ne t'aidera pas à faire ça. Alors que mon exemple 2 pourrait te donner des pistes...
    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.

  5. #25
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    Je suis en java 8 apparemment et le compilo grogne sur les parenthèses avant la flèche.
    Hum, bizarre. Attention, il y a bien [c](()->[/.c]. La première parenthèse concerne les parenthèses nécessaires à la première dans service.scheduleAtFixedRate();, à la syntaxe des appels de méthodes. Les deux autres sont indispensable dans l'expression lambda, parce que la méthode de l'interface fonctionnelle Runnable, run(), n'a pas de paramètre, et qu'une expression lambda est toujours sous la forme [paramètres]->[expression ou bloc]. Sans paramètre, pour éviter d'avoir juste -> panel.repaint(), on met () devant.
    Citation Envoyé par SeniorEric Voir le message
    Pour revenir au timer, est ce qu'il y a l'équivalent d'un sleep ? J'ai vu Thread.sleep mais c'est pas ce que je veux.
    Je ne comprend pas trop la question : un timer exécute une tâche au bout d'un certain temps, puis périodiquement. En gros, ça fait :
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    j'attends le temps initial
    j'éxécute la tâche
    j'attends 
    je reboucle à "j'exécute la tâche"


    Citation Envoyé par SeniorEric Voir le message
    J'ai vu Thread.sleep mais c'est pas ce que je veux.
    Si c'est attendre que tu veux, c'est bien Thread.sleep() (il y a bien un moyen détourner de le faire avec un wait(), qui peut avoir l'avantage de pouvoir être annuler).
    Donc qu'est ce que tu veux au juste, si ça n'est pas attendre...

    Citation Envoyé par SeniorEric Voir le message

    Ce que je pensais faire c'est u cercle toutes les 2 secondes, j'imaginais un cercle, sleep 2, un cercle, sleep 2, dans une boucle while true, à l'ancienne quoi !!! :-)
    Tu peux faire ça comme ça (la boucle à l'ancienne), mais surtout pas dans l'EDT (l'Event Dispatch Thread = le thread de Swing). En gros, ce thread qui, comme tous les threads, ne peut faire qu'une seule chose à la fois fait en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    je traite tous les évenements,
    je traite tout ce qu'on me demande de faire dans les méthodes du genre paint() etc..
    je rafraichit l'affichage pour qu'on voit le résultat
    je reboucle au début
    Si tu fais une boucle dans une méthode paint() par exemple, et bien le résultat de la boucle sera visible lorsque la boucle sera terminée, donc tous les états intermédiaires ne seront jamais visibles.

    Mais plutôt qu'une boucle à l'ancienne, c'est quand même bien plus simple, sauf cas très particulier, de faire ça avec un Timer (qui est juste un thread simplifié qui fait cette boucle pour toi), ou un SwingWorker également qui poura te permettre d'afficher des choses plus complexe (ça sert surtout lorsqu'on a un traitement très long qui rafraichit l'affichage par étape intermédiaire).
    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.

  6. #26
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    J'ai fait une autre version avec un timer qui n'utilise pas les windows events qui gère le redimensionnement de la fenetre et ou les disques grossissent lentement j'aime bien

    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;
     
    import javax.swing.JColorChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
     
     
    class Fenetre extends JPanel  {
    	private Color couleurdefond ;
    	private ArrayList<Disque> mesdisques ;
    	Fenetre(Color couleur,ArrayList<Disque> mesdisques) {
    		this.couleurdefond = couleur ;
    		this.mesdisques = mesdisques ;
    		setLayout(new FlowLayout());
    		setBackground(couleur) ;
    	}
    	public void paint(Graphics g) {
     
    		 final int width=getWidth();
    		 final int height=getHeight();
    	     Random randomno = new Random();
    		 int diametre = randomno.nextInt(150);
    		 int abscisse = randomno.nextInt(width-diametre);
    		 int ordonnee = randomno.nextInt(height-diametre);
    		 int rcolor = randomno.nextInt(255);
    		 int gcolor = randomno.nextInt(255);
    		 int bcolor = randomno.nextInt(255);
    		 super.paint(g);
    		 Disque disque = new Disque(abscisse,ordonnee,diametre,rcolor,gcolor,bcolor,g) ;
    		 mesdisques.add(disque);
    		 for (Disque mondisque : mesdisques) {
    			 int olddiam = mondisque.getDiametre() ;
    			 olddiam+=1 ;
    			 mondisque.setDiametre(olddiam) ;
    			 mondisque.Afficher(g) ;
    		 }
     
    	}
    }
     
    class Disque {
    	private int XO,YO,diam,rC,gC,bC ;
    	private Graphics g ;
    	Disque(int XO,int YO,int diam,int rC,int gC,int bC,Graphics g) {
    		this.XO = XO ;this.YO = YO ;this.diam = diam ;this.rC = rC ;this.gC = gC ;this.bC = bC ;
    		//g.setColor(new Color(rC,gC,bC)) ;
    		//g.fillOval(XO, YO, diam, diam) ;
    		//g.dispose() ; 
    	}
    	void Afficher(Graphics g) {
    		g.setColor(new Color(this.rC,this.gC,this.bC)) ;
    		g.fillOval(this.XO, this.YO, this.diam, this.diam) ;
    		//g.dispose() ; 
    	}
    	int getDiametre() {
    		return this.diam ;
    	}
    	void setDiametre(int diametre) {
    		this.diam = diametre ;	
    	}
    }
    public class DisquesAleatoires {
     
    	public static void main(String[] args) {
    		ArrayList<Disque> mesdisques = new ArrayList<Disque>() ;
    		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
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Disques Aléatoires");
    		final JPanel panel = new Fenetre(couleur,mesdisques) ;
     
    		frame.add(panel) ;
    		TimerTask tache = new TimerTask() {     // création et spécification de la tache à effectuer
    	         @Override
    	         public void run() {
    	        	panel.repaint() ;
     
    	         }
    	     };
    	    timer.scheduleAtFixedRate(tache,startTime,temps);  // ici on lance la mecanique
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(true) ;
    		frame.setVisible(true);
     
    	}
    }

    je suis assez content de moi ....

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    Sinon je voudrais revenir sur la méthode paint() et getgraphics.
    A mes tous débuts je prenais g par un getGraphics pour faire un g.drawline par exemple. Mais j'ai vu que getGraphics peut retourner null et que c'est dans paint() qu'il faut dessiner.

    Pour afficher un disque là où on clique je faisais un g=getgraphics; puis g.fillOval dans mouseclicked.
    Mais si on ne veut pas utiliser getgraphics, et qu'il faut faire le g.fillOval dans paint, que faire dans mouseclicked? Juste stocker la position de la souris par getX et getY dans des variables globales pour les utiliser dans paint ? Faut il redemander un repaint() ? et où ?

    et que fait g.dispose() ?

  8. #28
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    J'ai fait une autre version avec un timer qui n'utilise pas les windows events qui gère le redimensionnement de la fenetre et ou les disques grossissent lentement j'aime bien [...]
    je suis assez content de moi ....
    Ce qu'il se passe quand on redimensionne la fenêtre est assez rigolo. Psychédélique ! C'est parce que tout est fait dans paint.
    En revanche, tu devrais faire int diametre = randomno.nextInt(Math.min(Math.min(width, height),150)); pour éviter l'erreur.
    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. #29
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par SeniorEric Voir le message
    Sinon je voudrais revenir sur la méthode paint() et getgraphics.
    A mes tous débuts je prenais g par un getGraphics pour faire un g.drawline par exemple. Mais j'ai vu que getGraphics peut retourner null et que c'est dans paint() qu'il faut dessiner.

    Pour afficher un disque là où on clique je faisais un g=getgraphics; puis g.fillOval dans mouseclicked.
    Mais si on ne veut pas utiliser getgraphics, et qu'il faut faire le g.fillOval dans paint, que faire dans mouseclicked? Juste stocker la position de la souris par getX et getY dans des variables globales pour les utiliser dans paint ? Faut il redemander un repaint() ? et où ?

    et que fait g.dispose() ?
    Il ne faut pas (jamais) utiliser cette méthode (getGraphics()) en dehors d'une méthode appelée par paint). Dans le mouseclicked il te suffit d'ajouter un disque dans la liste.

    J'ai ajoute ça dans ton code précédent :
    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
    class Fenetre extends JPanel  {
    	private Color couleurdefond ;
    	private ArrayList<Disque> mesdisques ;
    	Fenetre(Color couleur,ArrayList<Disque> mesdisques) {
    		this.couleurdefond = couleur ;
    		this.mesdisques = mesdisques ;
    		setLayout(new FlowLayout());
    		setBackground(couleur) ;
    		addMouseListener(new MouseAdapter() {
     
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				 final int width=getWidth();
    				 final int height=getHeight();
    			     Random randomno = new Random();
    				 int diametre = randomno.nextInt(Math.min(Math.min(width, height),150));
    				 int abscisse = e.getX()-diametre/2;
    				 int ordonnee = e.getY()-diametre/2;
    				 int rcolor = randomno.nextInt(255);
    				 int gcolor = randomno.nextInt(255);
    				 int bcolor = randomno.nextInt(255);
    				 Disque disque = new Disque(abscisse,ordonnee,diametre,rcolor,gcolor,bcolor) ;
    				 mesdisques.add(disque);
    				 repaint();
    			}
     
    		});
    	}
    	public void paint(Graphics g) {
     
    		 super.paint(g);
    		 for (Disque mondisque : mesdisques) {
    			 mondisque.Afficher(g) ;
    		 }
     
    	}
    	public void anim() {
    		 for (Disque mondisque : mesdisques) {
    			 int olddiam = mondisque.getDiametre() ;
    			 olddiam+=1 ;
    			 mondisque.setDiametre(olddiam) ;
    		 }
    		 repaint();
    	}
    }
     
    class Disque {
    	private int XO,YO,diam,rC,gC,bC ;
    	Disque(int XO,int YO,int diam,int rC,int gC,int bC) {
    		this.XO = XO ;this.YO = YO ;this.diam = diam ;this.rC = rC ;this.gC = gC ;this.bC = bC ;
    		//g.setColor(new Color(rC,gC,bC)) ;
    		//g.fillOval(XO, YO, diam, diam) ;
    		//g.dispose() ; 
    	}
    	void Afficher(Graphics g) {
    		g.setColor(new Color(this.rC,this.gC,this.bC)) ;
    		g.fillOval(this.XO, this.YO, this.diam, this.diam) ;
    		//g.dispose() ; 
    	}
    	int getDiametre() {
    		return this.diam ;
    	}
    	void setDiametre(int diametre) {
    		this.diam = diametre ;	
    	}
    }
    public class DisquesAleatoires {
     
    	public static void main(String[] args) {
    		ArrayList<Disque> mesdisques = new ArrayList<Disque>() ;
    		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
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Disques Aléatoires");
    		final Fenetre panel = new Fenetre(couleur,mesdisques) ;
     
    		frame.add(panel) ;
    		TimerTask tache = new TimerTask() {     // création et spécification de la tache à effectuer
    	         @Override
    	         public void run() {
    	        	panel.anim() ;
     
    	         }
    	     };
    	    timer.scheduleAtFixedRate(tache,startTime,temps);  // ici on lance la mecanique
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(true) ;
    		frame.setVisible(true);
     
    	}
    }
    g.dipose() avec g de type Graphics libère la mémoire utilisé par le context graphique : ça détruit le contexte graphique. Tu ne dois pas le faire (même si ça ne gène pas Swing, parce qu'il va recréer un contexte au besoin, c'est gênant pour les performances). Une règle générale, pas seulement pour les ressources graphiques, mais pour toutes les ressources libérables : ne jamais libérer des ressources qu'on n'a pas créé soi-même et toujours libérer des ressources qu'on a créé soi-même.
    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.

  10. #30
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    OK, pas mal. Je vois qu'on peut utiliser des mouselistener sans implementer l'interface je prends note...

    Je suis passé au labyrinthe. http://sebastien-estienne.developpez...a2d/?page=exo7
    J'ai ouvert une frame avec un Jpanel qui va contenir 2 Jpanel, un à l'west l'autre au center. Dans le Jpanel de gauche on peut saisir un plan dans un JtextArea et appuyer sur un Jbutton. Dans le JPanel de droite on verra le jeu du labyrinthe, je l'espère...

    Quand j'ai tout mis dans le main ça marchait, et maintenant que j'ai externalisé un peu les 2 Jpanel ça ne marche plus, et je ne vois pas comment débugger.

    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
    package labyrinthe;
     
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
     
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.border.BevelBorder;
     
    class PanneauSaisie extends JPanel {
    	private static final long serialVersionUID = 1L;
    	PanneauSaisie () {
     
    	   setLayout(new BorderLayout());
    	   String texte = "Veuillez rentrer le plan du labyrinthe" ;
    	   JButton jouer = new JButton("Jouer") ;
    	   JLabel intro = new JLabel("Veuillez entrer le plan du labyrinthe") ;
    	   JTextArea zoneSaisie = new JTextArea(texte,12,12) ;
    	   zoneSaisie.setLineWrap(true);
    	   zoneSaisie.setPreferredSize(new Dimension(200, 200));
     
    	   add(intro,BorderLayout.NORTH);
    	   add(zoneSaisie,BorderLayout.CENTER);
    	   add(jouer,BorderLayout.SOUTH);
     
    	}
     
    }
    class PanneauJeu extends JPanel {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L ;
    	PanneauJeu() {
    	    setLayout(new BorderLayout());
     
     
    	}
    }
    public class LanceLabyrinthe {
    	public static void main(String[] args) {
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Labyrinthe JAVA");
    		JPanel panel = new JPanel() ;
    		panel.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
    		panel.setLayout(new BorderLayout());
    		JPanel panelJeu = new PanneauJeu() ;
    		panelJeu.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
    		JPanel panelSaisie = new PanneauSaisie() ;
    		panelSaisie.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
    		panel.add(panelSaisie, BorderLayout.WEST);
    		panel.add(panelJeu, BorderLayout.CENTER);
    		panel.setBackground(couleur) ;
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(true) ;
    		frame.setVisible(true);
    	}
    }
    Ca devrait marcher ...

  11. #31
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu as juste oublié de mettre le JPanel panel dans la JFrame frame :
    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
    public static void main(String[] args) {
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Labyrinthe JAVA");
    		JPanel panel = new JPanel() ;
    		panel.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
    		panel.setLayout(new BorderLayout());
    		JPanel panelJeu = new PanneauJeu() ;
    		panelJeu.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
    		JPanel panelSaisie = new PanneauSaisie() ;
    		panelSaisie.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
    		panel.add(panelSaisie, BorderLayout.WEST);
    		panel.add(panelJeu, BorderLayout.CENTER);
    		panel.setBackground(couleur) ;
    		frame.add(panel);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(true) ;
    		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.

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    je viens de voir, merci. Un peu la honte pour moi quand même !

  13. #33
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    en fait je ne vois pas comment communiquer entre les 2 Jpanel. J'aimerais traiter le plan reçu par le JtextField et l'appui sur le bouton pour afficher le plan graphique du labyrinthe sur le Jpanel de droite, donc dans sa méthode paint(). et je sèche...

    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
    package labyrinthe;
     
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.border.BevelBorder;
     
    class PanneauSaisie extends JPanel {
    	private static final long serialVersionUID = 1L;
    	private static String planlab ;
    	PanneauSaisie () {
     
    	   setLayout(new BorderLayout());
    	   String texte = "Plan du labyrinthe" ;
    	   JButton jouer = new JButton("Jouer") ;
    	   JLabel intro = new JLabel("Veuillez entrer le plan du labyrinthe") ;
    	   final JTextArea zoneSaisie = new JTextArea(texte,12,12) ;
    	   zoneSaisie.setLineWrap(true);
    	   zoneSaisie.setPreferredSize(new Dimension(200, 200));
     
    	   jouer.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e) {
    				String textesaisi = zoneSaisie.getText();
    				planlab = textesaisi ;
    				System.out.println("On a appuyé sur jouer : \n"+ textesaisi) ;
     
    			}
    		});
     
     
     
    	   add(intro,BorderLayout.NORTH);
    	   add(zoneSaisie,BorderLayout.CENTER);
    	   add(jouer,BorderLayout.SOUTH);
     
    	}
    	String getPlan() {
    		return planlab ;
    	}
    }
    class PanneauJeu extends JPanel {
     
     
    	private static final long serialVersionUID = 1L ;
    	PanneauJeu() {
    	    setLayout(new BorderLayout());
     
     
    	}
    }
    public class LanceLabyrinthe {
    	public static void main(String[] args) {
    		Color couleur = Color.WHITE ;
    		JFrame frame = new JFrame("Labyrinthe JAVA");
    		JPanel panel = new JPanel() ;
     
    		panel.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
    		panel.setLayout(new BorderLayout());
     
    		JPanel panelSaisie = new PanneauSaisie() ;
    		panelSaisie.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
     
    		JPanel panelJeu = new PanneauJeu() ;
    		panelJeu.setBorder(new javax.swing.border.BevelBorder(BevelBorder.RAISED));
     
    		panel.add(panelSaisie, BorderLayout.WEST);
    		panel.add(panelJeu, BorderLayout.CENTER);
    		panel.setBackground(couleur) ;
     
    		frame.add(panel) ;
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLocation(200, 200);
    		frame.setSize(600,400);
    		frame.setResizable(true) ;
    		frame.setVisible(true);
    	}
    }
    par des méthodes j'imagine mais je suis trop formaté ancienne génération de langage...

    ou alors dans le actionperformed du bouton, il faut que je déssine dans le Jpanel de droite... mais comment ..?

  14. #34
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y'a 2 manières de communiquer entre 2 instances de classes (donc entre 2 panels différents) :

    • en direct, par invocation de méthode, ce qui oblige d'avoir la référence de l'objet pour pouvoir appeler la méthode
    • par un système de messages
      • le système dit observateur/observable est un motif standard (design pattern) d'architecture permettant à un objet d'être averti (on dit "notifié" par abus d'anglicisme)) lorsque l'information est modifié par l'autre classe. La notification de cette modification porte la valeur modifiée, ce qui permet au second composant d'en faire ce qu'il veut. C'est juste une manière plus structuré que le mode direct, et surtout qui permet d'éviter d'avoir un lien dur entre les deux classes (avoir la référence de l'autre classe et devoir appeler une méthode déterminée) ;
      • le système évenementiel est un système simulaire mais qui n'est pas strictement défini (tu peux par exemple utiliser la classe SwingPropertyChangeSupport pour faire ça) ;
      • la mise en place d'un MVC (Modèle/Vue/Controleur), qui utilise les techniques précédentes : il s'agit d'une architecture classique lorsqu'on fait des interfaces graphiques qui permet de s'assurer qu'on sépare bien les différents composants (afin de pouvoir les réutiliser dans différents contextes)
      • Je ne parlerai pas des autres systèmes de messages, plus complexes, qui ne serviront de toute manière pas ici (qui servent plutôt pour communiquer entre applications, voire entre systèmes).


    Ceci peut te sembler compliqué au premier abord, mais en réalité tu as déjà mis en place des choses similaires, par exemple, avec le timer. Imagine que le timer soit l'un de tes 2 panels : il appelle bien une méthode d'une autre classe (le panel où les disques sont dessinés), mais il ne le fait pas directement : la classe timer n'a pas de référence du panel. Quelque soit le type de timer (ou SchedulerService dans mon exemple), cela se fait par l'intermédiare d'une autre classe, l'ActionListener dans un cas, le Runnable dans l'autre. C'est elle qui permet d'éviter le lien dur.
    La différence avec ce système, c'est que dans le cas de l'observable/observé, ou évenementiel, c'est le composant qui a besoin de l'information qui demande à celui qui la produit d'être informé de sa modification. Ainsi le composant qui produit l'information a juste à savoir qu'il la produit, pas savoir qui en a besoin. Exactement comme avec un JTextField, quand tu lui colles un ActionListener pour savoir que le texte a été modifié. Pour le faire, soit on met place une interface, et le composant qui produit va avoir une liste d'instances de cette interface pour savoir qui informer, soit tu peux utiliser SwingPropertyChangeSupport qui est plus simple, donc plus limité, mais qui fournit une interface toute faite. Il y a des classes qui permettent de gérer le premier cas également (Event, EventListener, EventListenerList, etc.)
    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.

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    oui c'est un peu compliqué, j'aurais tendance à penser que j'ai juste besoin d'une variable globale de type chaine, que j'initialise dans le panneau de gauche dans actionperformed et que j'utilise à droite dans le paint. Il faut que dans actionperformed de gauche je lance le repaint de droite. Mais je n'y arrive pas. Pas de variables globales en java, faut passer par des accesseurs je sais mais j'arrive pas. Je vais chercher encore, ça doit etre faisable...

  16. #36
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je n'ai pas parlé de la solution "variable globale" parce qu'elle n'est pas une bonne solution générale. Ce n'est pas une bonne habitude à prendre que d'utiliser des variables "globales" parce que ça fait des applications rigides.

    S'il n'y a pas de notion de variable globale en Java, on peut faire une variable static public, donc accessible depuis toutes les classes et méthodes.
    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. #37
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    il vient de m'arriver un truc pas cool ! J'ai fait une boucle infinie en voulant traiter ma String pour faire des carrés, j'ai pas fait gaffe, et impossible d'arreter le programme. J'ai coupé eclipse mais je programme tournait tjrs. Du coup j'ai redémarré propre et impossible de booter. Le pc s'est mis en reparation automatique sans aboutir. Alors j'ai été obligé de tout réinstaller ubuntu à partir d'une clé usb, faut que je réinstalle tout.
    Je ne sais pas ce qui s'est passé, ça a niqué le boot.
    Là je réinstalle java ...

  18. #38
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Une boucle infinie qui flingue le boot, ou quoique ce soit sur le disque, c'est très surprenant. Je ne suis pas vraiment spécialiste de linux, mais je pense plutôt à un autre process travaillant avec le disque au moment où tu as redémarré (comment d'ailleurs, en forçant l'arrêt "hardware" du pc ?).
    En cas de boucle infinie, si le code dans la boucle est concis, on peut avoir une consommation cpu elevée qui empêche toute autre exécution. Normalement, avec un peu de patience, on arrive toujours à accèder à un moyen de tuer le process (kill -9).
    Pour arrêter un process, sous Eclipse (c'est ce que je fais sous Windows en tout cas) :
    • clic sur le bouton rouge associé au process
    • si ça ne marche pas, tuer le process java, puis quitter Eclipse
      si on ne peut quitter Eclipse (il ne répond plus)
      • tuer le process d'Eclipse
        au redémarrage d'Eclipse, il se peut que le workspace soit en erreur, voire qu'Eclipse fasse des erreurs, dans ce cas,
        • quitter proprement Eclipse et le redémarrer (si Eclipse refait des erreurs, recommencer)
        • faire un clean de tous les projets

        Si ça ne marche toujours pas, lancer Eclipse en mode clean (en ligne de commande, Eclipse -clean)
    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. #39
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    j'avais déjà eu ça avec windows sur le même PC : avast tournait en boucle et ralentissait le PC, je le désactive et il me demande de rebooter. Il n'a jamais plus booté sous windows, c'est la que j'ai installé linux.
    La perte est relative...je m'en remetrai je pense.
    Et puis la plupart de mes sources java sont sur ce forum

  20. #40
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2016
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 85
    Points : 20
    Points
    20
    Par défaut
    la boucle infinie était dans le paint d'un JPanel. Ca ne doit pas aider.

    Sinon : Si je définis une méthode A dans une class Pano extends JPanel et que monpano = new Pano() ;
    si je fais monpano.A(), il me dit que A() n'est pas une méthode de JPanel. OK, mais c'est une méthode de Pano, comment puis je appliquer la méthode A() sur monpano ?

    C'est surement hyper simple mais je bugg!!!

    ]

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