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

avec Java Discussion :

Programmation évènementielle Java


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Programmation évènementielle Java
    Bonjour,
    Je commence la programmation évènementielle en Java et je suis confronté à un problème.
    Pour m'expliquer, je souhaite faire en sorte qu'un dessin soit affiché dans ma fenêtre lorsque la fenêtre est au premier plan. Et lorsque celle-ci passe en arrière plan, le dessin doit changé. Cependant je ne voit pas comment "remplacer" le composant présent en avant plan par celui qui doit être affiché lorsque la fenêtre est en arrière plan et inversement. Le problème rencontré ici est le fait que la fenêtre reste toujours au premier plan.

    En vous remerciant de votre aide ,
    Zarrok.

    P.S. : Voici le code de mon "controleur"

    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
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
     
    public class Controleatt extends WindowAdapter {
        private JFrame fen;
        private Composant c1 = new Composant();
        private Composant2 c2 = new Composant2();
        public Controleatt(JFrame f) {
            this.fen = f;
        }
        @Override
        public void windowActivated(WindowEvent e) {
            this.fen.add(c1);                                                                                Je pense que cette partie est fausse mais je ne vois pas comment faire :/
            this.fen.setVisible(true);
            System.out.println("devant");
        }
        @Override
        public void windowDeactivated(WindowEvent e) {
     
            this.fen.add(c2);
            this.fen.setVisible(true);
            System.out.println("derrière");
     
        }
    }

  2. #2
    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
    Salut,

    Le problème est que le fen.setVisible(true) rend active la fenêtre (et la passe en avant plan dans l'application). Ne fais simplement pas ce setVisible(true). Ensuite pour gérer l'alternance entre les 2 composants, tu peux utiliser un CardLayout.
    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
    public class Demo {
     
    	public Demo() {
     
    		JFrame otherFrame = createFrame("Frame 1");
    		JFrame frame = createFrame("Frame 1");
    		frame.setLocation(otherFrame.getX()+otherFrame.getWidth(), frame.getY());
     
    		CardLayout cardLayout  = new CardLayout();
    		frame.getContentPane().setLayout(cardLayout);
     
    		frame.getContentPane().add( new JLabel("AVANT PLAN"), "COMP1");
    		frame.getContentPane().add( new JLabel("ARRIERE PLAN"), "COMP2");
     
    		frame.addWindowListener(new WindowAdapter() {
     
    			@Override
    			public void windowActivated(WindowEvent e) {
    				cardLayout.show(frame.getContentPane(), "COMP1");
    			}
    			@Override
    			public void windowDeactivated(WindowEvent e) {
    				cardLayout.show(frame.getContentPane(), "COMP2");
    			}
     
    		});
    	}
     
    	private JFrame createFrame(String title) {
    		JFrame frame = new JFrame(title);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    		return frame;
    	}
     
    	public static void main(String[] args) {
    		new Demo();
    	}
     
    }
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Tout d'abord merci de ta réponse
    En réalité, il s'agit d'un sujet de TP (je suis en DUT info), et je ne pense pas avoir à utiliser ce dont tu m'as parlé ( je n'en avais pas encore entendu parler ^^).
    Pour être plus clair voici la consigne qui m'a été donné :
    Écrivez une application qui ouvre une fenêtre contenant un disque magenta sur fond vert. Lorsque la fenêtre est en arrière-plan, le cercle doit être remplacé par un sablier.

    Voici le code que j'ai réalisé mais il ne fonctionne pas, en réalité j'insère un composant dans la fenêtre ( de type "Composant" qui est "déguisé" en JComponent) et je tente de le redéfinir ensuite :
    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
     
    import javax.swing.*;
    import java.awt.*;
     
    public class Attente {    // Classe principale
      public static void main(String[] args) {
        // un objet pour servir de fenetre
        JFrame fenetre = new JFrame();
        JComponent composant = new Composant();
     
        // on configure la fenetre
        fenetre.setSize(500, 300);
        fenetre.setLocation(0, 0);
        fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        Dimension dimensions = new Dimension(510,350);
        fenetre.setMinimumSize(dimensions);
     
        fenetre.add(composant);
        Controleatt ctr = new Controleatt(fenetre,composant);
        fenetre.addWindowListener(ctr);
        fenetre.setVisible(true);
     
      }
    }
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
     
    public class Controleatt extends WindowAdapter { // Controleur
        private JFrame fen;
        private JComponent comp;
        private Composant comp1 = new Composant();
        private Composant2 comp2 = new Composant2();
        public Controleatt(JFrame f, JComponent c) {
            this.fen = f;
            this.comp = c;
        }
        @Override
        public void windowActivated(WindowEvent e) {
            this.comp = comp1;
            this.comp.repaint();
            System.out.println("devant");
        }
        @Override
        public void windowDeactivated(WindowEvent e) {
            this.comp = comp2;
            this.comp.repaint();
     
            System.out.println("derrière");
     
        }
    }
    Sachant que Composant désigne le dessin devant être affiché lorsque la fenêtre est au premier plan et Composant2 celui devant être affiché lorsque la fenêtre est à l'arrière plan. L'objectif est donc de modifier le composant inséré dans le main et de le "repeindre" ensuite. Désolé si je n'avais pas été assez clair précédemment.
    Merci de ton aide, Zarrok.

  4. #4
    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 ne vois rien dans l'énoncé que tu donnes qui dit qu'il y a une notion de remplacement de composant, et pas plus d'interdiction d'utiliser un CarLayout. Quoiqu'il en soit, un Component d'UI SWING :

    • est affiché dans un container
    • on peut ajouter ou retirer des composants dans/au container, pas en remplacer. Remplacer un composant dans le cas général se traduit donc par retirer des composants et en ajouter. C'est donc bien plus simple et direct d'utiliser un CardLayout.
    • Si une variable pointe sur une instance de Component, et qu'on la fait pointer sur une autre instance de Component; ça n'a strictement aucun effet sur l'affichage, sauf si on a programmer un système équivalent à un CardLayout (mais qui n'afficherait que 2 composants), donc une classe qui implémenterait au moins LayoutManager.
    • Quand on ajoute ou enlève des composants d'un container déjà affiché, il faut penser à avertir l'UI (voir les méthodes validate(), invalidate() et revalidate())


    Si j'avais un tel énoncé à réaliser, je ferais un seul composant (JPanel ou Canvas), avec un booléen : dans la méthode paint(), pour une valeur du booléen je dessiner un disque magenta sur fond vert, et pour l'autre un sablier. Et sur les évenements d'activation/désactivation, j'appelle une méthode de ce composant qui fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void setTruc(boolean truc) {
       if ( this.truc!=truc) {
          this.truc=truc;
          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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    D'accord je pense comprendre le principe, c'est dans le composant en lui même que je dois apporter des modifications.

    Voici le code du composant en question :
    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
     
    import javax.swing.JComponent;
    import java.awt.*;
     
    public class Composant extends JComponent {
      public Composant() {
        super();
      }
      @Override
      public void paintComponent(Graphics pinceau) {
        Graphics secondPinceau = pinceau.create();
        //Color couleur = new Color(0,0,0);
        secondPinceau.setColor(Color.GREEN);
        secondPinceau.fillRect(0,0,getWidth(),getHeight());
        secondPinceau.setColor(Color.MAGENTA);
        secondPinceau.fillOval(0,0,getWidth(),getHeight());
      }
    }
    C'est de cette façon que j'ai appris à dessiner un composant. Je comprend ce que tu veux me dire, cependant je ne comprend pas comment l'appliquer, surtout au niveau des dépendances car il me semble que repaint() appelle paint() qui lui même appelle paintComponent(), en conséquence comment faire parvenir à paintComponent() le paramètre lui permettant de "savoir" quelle partie de son code exécuter ?
    Mes excuses si je comprend pas parfaitement ce que tu essaies de m'expliquer, je suis novice en la matière ^^'
    En tout cas merci de m'accorder une partie de ton temps, Zarrok.

  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 : 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 Zarrok Voir le message
    car il me semble que repaint() appelle paint() qui lui même appelle paintComponent(),
    en fait, repaint() provoque l'appel de paint().
    Citation Envoyé par Zarrok Voir le message
    en conséquence comment faire parvenir à paintComponent() le paramètre lui permettant de "savoir" quelle partie de son code exécuter ?
    En gérant un état sur la classe :

    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
    public class Composant extends JComponent {
     
       private boolean arrierePlan;
     
      public Composant() {
        super();
      }
     
      public void setArrierePlan(boolean arrierePlan) {
          if ( this.arrierePlan!=arrierePlan) {
             this.arrierePlan=arrierePlan;
             repaint();
          }
       }
     
      @Override
      public void paintComponent(Graphics pinceau) {
        Graphics secondPinceau = pinceau.create();
        //Color couleur = new Color(0,0,0);
        if ( arrierePlan ) {
            // dessin sablier
        }
        else {
           // dessin disque magenta sur fond vert
           secondPinceau.setColor(Color.GREEN);
           secondPinceau.fillRect(0,0,getWidth(),getHeight());
           secondPinceau.setColor(Color.MAGENTA);
           secondPinceau.fillOval(0,0,getWidth(),getHeight());
        }
      }
    }

    Il y a une autre façon de gérer ça par évenement de façon transparent (le composant intègre ce fonctionnement, et on utilise pas de WindowsListener externe), avec un HierarchyListener :

    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
    public class Demo {
     
    	public Demo() {
     
    		JFrame otherFrame = createFrame("Other Frame");
    		JFrame frame = createFrame("Frame 1");
    		frame.setLocation(otherFrame.getX() + otherFrame.getWidth(),
    				frame.getY());
     
    		frame.getContentPane().add(new Composant());
     
    	}
     
    	private JFrame createFrame(String title) {
    		JFrame frame = new JFrame(title);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    		return frame;
    	}
     
    	public static void main(String[] args) {
    		new Demo();
    	}
     
    	public static class Composant extends JComponent {
    		private boolean arrierePlan;
    		private final WindowListener windowListener;
     
    		public Composant() {
    		    super();
    		    windowListener = new WindowAdapter() {
    		    	@Override
    		    	public void windowActivated(WindowEvent e) {
    		    		setArrierePlan(false);
    		    	}
    		    	@Override
    		    	public void windowDeactivated(WindowEvent e) {
    		    		setArrierePlan(true);
    		    	}
    			};
    		    addHierarchyListener(new HierarchyListener() {
     
    				private Window windowAncestor;
     
    				@Override
    				public void hierarchyChanged(HierarchyEvent e) {
    					if ( (e.getChangeFlags()&HierarchyEvent.PARENT_CHANGED)==HierarchyEvent.PARENT_CHANGED) {
    						if ( windowAncestor!=null ) {
    							windowAncestor.removeWindowListener(windowListener);
    						}
    						windowAncestor=SwingUtilities.getWindowAncestor(Composant.this);
    						if ( windowAncestor!=null ) {
    							windowAncestor.addWindowListener(windowListener);
    							setArrierePlan(!windowAncestor.isActive());
    						}
    					}
    				}
    			});
    	  }
     
    		public void setArrierePlan(boolean arrierePlan) {
    			if (!arrierePlan != arrierePlan) {
    				this.arrierePlan = arrierePlan;
    				repaint();
    			}
    		}
     
    		@Override
    		public void paintComponent(Graphics pinceau) {
    			Graphics secondPinceau = pinceau.create();
    			if (arrierePlan) {
    				secondPinceau.setColor(Color.WHITE);
    				secondPinceau.fillRect(0, 0, getWidth(), getHeight());
    				secondPinceau.setColor(Color.CYAN);
    				secondPinceau.fillOval(0, -getHeight()/2, getWidth(), getHeight());
    				secondPinceau.fillOval(0, +getHeight()/2, getWidth(), getHeight());
    			} else {
    				secondPinceau.setColor(Color.GREEN);
    				secondPinceau.fillRect(0, 0, getWidth(), getHeight());
    				secondPinceau.setColor(Color.MAGENTA);
    				secondPinceau.fillOval(0, 0, getWidth(), getHeight());
    			}
    		}
    	}
     
    }
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Je comprend mieux merci beaucoup de ton aide
    Le HierarchyListener semble intéressant je pense m'y pencher pour en apprendre plus .
    En tout cas encore une fois merci !
    Bonne continuation à toi, Zarrok

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

Discussions similaires

  1. [Delphi 7] Programmation événementielle
    Par alainvh dans le forum Delphi
    Réponses: 3
    Dernier message: 09/03/2007, 15h39
  2. Réponses: 11
    Dernier message: 15/02/2007, 17h11
  3. Programmation objet Java
    Par vandamme dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2006, 19h51
  4. [livre que faire ?]Programmer en Java
    Par paterson dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/04/2006, 23h50
  5. Programmation évènementielle
    Par nicolas666 dans le forum C++
    Réponses: 5
    Dernier message: 31/01/2006, 09h37

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