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 :

Objet graphics et boutons cliquables


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Espagne

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2019
    Messages : 16
    Par défaut Objet graphics et boutons cliquables
    Bonjour,
    je débute dans le monde (merveilleux) du java "orienté objet" et j'ai un problème avec un petit programme, pas du tout ambitieux, et dont je ne trouve pas de solution après avoir consulté nombre de forums...

    Je joins, plus bas, le code en espérant qu'une âme charitable voudra bien y jeter un œil...

    J'explique mon problème : le programme est sensé afficher un carré bleu (paramétrable) quand on clique sur un bouton, et un carré rouge quand on clique sur un autre.
    Le problème, c'est que le premier carré s'efface quand l'autre apparaît (et vice-versa) alors qu'il devrait rester en place ...
    J'ai essayé d'enlever la ligne " super.paintComponent(); qui permet d'utiliser le constructeur par défaut de la classe mère de l'objet graphics (si j'ai bien compris), du coup les 2 carrés restent affichés, mais il y a des trucs très bizarre qui se produisent (3eme bouton qui apparaît n'importe où !! ).

    Je pense que j'utilise mal la méthode repaint() sur l'objet graphics, ou bien c'est l'interface actionListener qui est mal redéfinie, je ne sais pas, j'ai tout essayé, rien n'y fait...

    Voici le code :

    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
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
     
    //********** Panneau contenant l'objet graphics *************
    public class Panneau extends JPanel {
      private int posX;
      private int posY;
      private String couleur;
     
     
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setBackground(Color.green);
     
        switch (couleur){
           	case "rouge": 
            	g.setColor(Color.RED);
            	break;
     
            	case "vert": 
            	g.setColor(Color.green);
            	break;
     
            	case "bleu": 
            	g.setColor(Color.blue);
            	break;
     
            	case "jaune": 
            	g.setColor(Color.yellow);
            	break;
     
            	case "orange":	
            	g.setColor(Color.orange);
            	break;
     
            	case "blanc": 
            	g.setColor(Color.white);
            	break;
            }
            g.fillRect(posX, posY, 20, 20); // On dessine un carré
        }
     
    //---- méthode pour changer les coordonnées ----
      public void setCoord(int X, int Y) {
        this.posX = X;
        this.posY = Y;
        //repaint();
      }
     
    //---- méthode pour changer la couleur ----
      public void setCoul(String coul) {
        this.couleur = coul;
      }  
    }
     
    //************* Fenetre *****************************
    public class Fenetre extends JFrame{
      private JButton bouton1 = new JButton("b1");
      private JButton bouton2 = new JButton("b2");
      private Panneau pan = new Panneau();
     
      //Constructeur de la classe fenetre
      public Fenetre(){
        this.setTitle("Rubik");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null); 
        this.setVisible(true);
        this.setAlwaysOnTop(true);
        //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(pan); 
     
        pan.add(bouton1);
        pan.add(bouton2);
     
       //On définit des Listener pour les 2 boutons 
        bouton1.addActionListener(new Bouton1Listener());
        bouton2.addActionListener(new Bouton2Listener());
     
      }
     
     
       //Classe interne écoutant le premier bouton
      class Bouton1Listener implements ActionListener{
        //Redéfinition de la méthode actionPerformed()
        public void actionPerformed(ActionEvent arg0) {
          pan.setCoord(100,100);
          pan.setCoul("bleu");
          pan.repaint();
     
     
        }
      }
     
      //Classe interne écoutant le 2eme bouton
      class Bouton2Listener implements ActionListener{
        //Redéfinition de la méthode actionPerformed()
        public void actionPerformed(ActionEvent arg0) {
          pan.setCoord(200,200);
          pan.setCoul("rouge");
          pan.repaint();
     
        }
      }
     
    }
     
     
    void main(){
    	Fenetre fen = new Fenetre();
     
    }
    Merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    L'appel super.paintComponent() ne doit être supprimé que par quelqu'un qui sait ce qu'il/elle fait (ex : faire un composant transparent ou translucide) et qui a pris les précautions nécessaires pour éviter l'affichage d'artefacts et autres choses déplaisantes. Cette méthode s'assure que le fond opaque du contrôle est remis en place avant que tu puisses dessiner dedans.

    En AWT / Swing / Java2D il n'y a pas d’état permanent, c'est toi qui indique ce qui doit apparaître sur l’écran lors d'une réactualisation du contenu. En l’occurrence si tu prends le temps de lire le code tu te rends bien compte qu'a cause du switch tu ne peux JAMAIS avoir les 2 rectangles affiches en même temps. Donc a toi de modifier ce code pour que les 2 rectangles puissent être affiches ou non en fonction des boutons qui ont été cliqués (astuce, il va falloir introduire un autre mécanisme, genre des flags booléens, pour savoir quoi afficher).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Espagne

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2019
    Messages : 16
    Par défaut
    Bonjour et merci pour ta réponse.

    J'ai modifié le code en virant le switch (donc la couleur n'est plus paramétrable), mais le problème persiste, la carré affiché disparaît lorsque je clique sur l'autre bouton...

    Je pense que l'instruction super.paintComponent(g); provoque la remise à zéro du Jpanel à chaque fois que la méthode repaint() est appelée dans les Listener des boutons. Si c'est cela la raison, le problème persistera toujours, même en utilisant des booléens dans les Listener, car il est inévitable d'appeler
    la méthode repaint() pour redessiner l'objet graphics non ?

    Cordialement,

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Il n'y a pas d'état persistant en AWT / Swing / Java2D ! Il est normal de tout redessiner à chaque fois tout comme il est normal que l'appel à super.paintComponent() réinitialise la surface. Le code précédent dessinait un seul et unique rectangle de la couleur courante actuelle. Si tu l'as à peine modifié alors ça ne change rien : soit tu dessines un seul rectangle, soit le second se dessine par dessus le premier (on a pas vu ton nouveau code donc je ne sais pas quelles modifs tu as faites).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2019
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Espagne

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2019
    Messages : 16
    Par défaut
    Bonjour,

    Je ne parviens pas à trouver un moyen d'afficher le 2eme carré sans que le premier disparaisse...

    Voici le code épuré (choix de la couleur du carré retiré).

    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
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
     
    //********** Panneau contenant l'objet graphics *************
    public class Panneau extends JPanel {
      private int posX;
      private int posY;
     
     
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        //this.setOpaque(false);
        this.setBackground(Color.green);
     
            g.setColor(Color.RED);
            g.fillRect(posX, posY, 20, 20); // On dessine un carré
        }
     
    //---- méthode pour changer les coordonnées ----
      public void setCoord(int X, int Y) {
        this.posX = X;
        this.posY = Y;
        //repaint();
      }
    }
     
     
    //************* Fenetre *****************************
    public class Fenetre extends JFrame{
      private JButton bouton1 = new JButton("b1");
      private JButton bouton2 = new JButton("b2");
      private Panneau pan = new Panneau();
     
      //Constructeur de la classe fenetre
      public Fenetre(){
        this.setTitle("Rubik");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null); 
        this.setVisible(true);
        this.setAlwaysOnTop(true);
        //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(pan); 
     
        pan.add(bouton1);
        pan.add(bouton2);
     
       //On définit des Listener pour les 2 boutons 
        bouton1.addActionListener(new Bouton1Listener());
        bouton2.addActionListener(new Bouton2Listener());
     
      }
     
     
       //Classe interne écoutant le premier bouton
      class Bouton1Listener implements ActionListener{
        //Redéfinition de la méthode actionPerformed()
        public void actionPerformed(ActionEvent arg0) {
          pan.setCoord(100,100);
          pan.repaint();
     
     
        }
      }
     
      //Classe interne écoutant le 2eme bouton
      class Bouton2Listener implements ActionListener{
        //Redéfinition de la méthode actionPerformed()
        public void actionPerformed(ActionEvent arg0) {
          pan.setCoord(200,200);
          pan.repaint();
     
        }
      }
     
    }
     
     
    void main(){
    	Fenetre fen = new Fenetre();
     
    }

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Oui mais ton code de dessin dessine un seul et unique rectangle donc c'est normal que un seul rectangle s'affiche. Essaie de comprendre que le contenu ne PERSISTE PAS entre chaque réaffichage ! Tu auras beau dessiner dans le composant, tout ce que tu as fait est totalement perdu lors du réaffichage suivant. Il te faut donc mettre du code pour dessiner les 2 rectangles.

    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
    boolean show1 = false;
    boolean show2 = false;
     
    button1.addActionListener(event -> {
        show1 = true;
        repaint();
    });
    button2.addActionListener(event -> {
        show2 = true;
        repaint();
    });
     
    public void paintComponent(Graphics g){
        super.paintComponent(g);
     
        if (show1) { 
            g.setColor(Color.RED);
            g.fillRect(0, 0, 20, 20); // On dessine un carré
        }
        if (show2) {
            g.setColor(Color.BLUE);
            g.fillRect(50, 50, 20, 20); // On dessine un carré
        }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. [JpGraph] Comment faire un bouton cliquable ?
    Par shkyo dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 29/03/2007, 11h19
  2. [C#] objet graphics dans une bitmap
    Par lancer83 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/08/2006, 14h30
  3. [VB.NET]Comment Imprimer un objet graphic
    Par razikos18 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/06/2006, 11h22
  4. Réponses: 1
    Dernier message: 14/04/2006, 21h46
  5. [PDE]Bouton cliquable uniquement quand un projet est sélect
    Par Niko31 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 12/01/2006, 01h25

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