IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

faire défiler un message dans un panel


Sujet :

AWT/Swing Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut faire défiler un message dans un panel
    Bonjour à tous ,

    Dans un exercice de prog, il m'est demandé de créer une application qui fait défiler un message dans un panel (en utilisant un timer). Lorsque le message a totalement quitté l'écran, il faut le faire réaparaitre de l'autre coté.
    Comme il s'agit du chapitre sur les éléments graphiques, j'aimerai utiliser un JLabel contenant le texte. Malheureusement, une fois que j'ajoute ce composant dans le panel, je n'ai aucun moyen de (re)définir son emplacement si ce n'est qu'à gauche, au milieu ou à droite... la method .setLocation(int x, int y) de l'objet n'y change rien du tout.

    Est-ce que je fais fausse route en utilisant un JLabel ?

    Merci d'avance

  2. #2
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Ton chapitre aborde les éléments graphiques. Je ne trouve donc pas déraisonnable de repartir à leur source.
    Je pense donc plus sage de t’orienter vers l’utilisation de java.awt.Graphics2D, qui te permettra de dessiner les portions de texte que tu souhaites (via drawString( ) par exemple), où tu le souhaites.

    Chris.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci Chris pour ta réponse, c'est effectivement avec drawString() que j'avais pensé commencer mais je voulais avoir votre avis concernant la version JLabel.

    Mon dernier souci, c'est que la donnée du problème me demande d'afficher le message dans un panel et que je n'y arrive pas. Dans une frame ca fonctionne, dans un panel que j'ajoute ensuite sur la frame, ca fonctionne pas...

    TextViewer.java
    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
     
    import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class TextViewer {
     
    	public static void main(String[] args) {
     
    		String text = "HELLO !";
    		int x = 0;
    		int y = 20;
     
    		JFrame frame = new JFrame();
     
    		/*
    		 * drawString dans la frame, ca fonctionne
    		frame.add(new DrawText(text, x, y));
    		*/
     
    		/*
    		 * drawString dans le panel, puis ajout du pannel dans la frame, ca fonctionne pas...
    		JPanel textPanel = new JPanel();
    		textPanel.add(new DrawText(text, x, y));
    		frame.add(textPanel, BorderLayout.NORTH);
    		*/
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(300,400);
    		frame.setVisible(true);
     
    	}
    }
    DrawText.java
    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
    import java.awt.Graphics;
    import java.awt.Graphics2D;
     
    import javax.swing.JComponent;
     
    public class DrawText extends JComponent
    {
    	private String text;
    	private int x;
    	private int y;
     
    	public DrawText(String text, int x, int y)
    	{
    		this.text = text;
    		this.x = x;
    		this.y = y;
    	}
     
    	public void paintComponent(Graphics g)
    	{
    		Graphics2D g2 = (Graphics2D) g;
    		g2.drawString(text,x,y);
    	}
    }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La version avec un JLabel tu peux l'oublier, ce serait trop lourd de faire ça.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    ça n'a rien de lourd avec le JLabel, il suffit de mettre le layout du panel à null, là tu pourras déplacer ton texte avec label.setBounds.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sauf que le JLabel déclenche un cerntain nombres de méthodes, qu'il faut repeindre le composant, ses bordures, déclencher d'hypothétiques évènement à chaque redéplacement et ça c'est lourd comparé à un simple drawString sur des graphics
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Je dois admettre que je suis bien incapable, dans l’immédiat, de te dire le pourquoi du comment ... Si quelqu’un le sait, cela m’intéresse.

    En revanche, pour faire simple. Si tu restes sur ton option de départ, et que tu hérites, non pas d’un JComponent, mais directement d’un JPanel ?
    Tu pourras ainsi gérer directement dans ton JPanel tous les effets visuels que tu souhaites, et en plus, le même code (ou presque) fonctionne très bien.

    DrawText.java :
    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
     
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import javax.swing.JPanel;
     
    public class DrawText extends JPanel
    {
     private String text;
     private int x;
     private int y;
     
     public DrawText(String text, int x, int y)
     {
      this.text = text;
      this.x = x;
      this.y = y;
     }
     
     public void paintComponent(Graphics g)
     {
                    super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      g2.drawString(text,x,y);
     }
    }
    TextViewer.java :
    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
     
    import java.awt.BorderLayout;
    import javax.swing.JFrame;
     
    public class TextViewer {
     
     public static void main(String[] args) {
     
      String text = "HELLO !";
      int x = 0;
      int y = 20;
     
      JFrame frame = new JFrame();
     
      /*
       * drawString dans la frame, ca fonctionne
                     */
      frame.add(new DrawText(text, x, y));
     
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(300,400);
      frame.setVisible(true);
     
     }
    }
    Chris

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Parfait, merci tout le monde, j'ai mes réponses

    Je vais m'en tenir à la solution qui consiste a retourner un JPanel au lieu d'un JComponent. C'est la version qui mon convient le mieux. Juste une dernière question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		Graphics2D g2 = (Graphics2D) g;
    		g2.drawString(text,x,y);
    	}
    Pourquoi est-il nécessaire d'appeler la method paintComponent de la superclass (c'est bien JPanel dans ce cas non ?) ?

  9. #9
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Pour une initialisation propre de ton JPanel

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    nickel, parfait merci beaucoup. Plus de question...

  11. #11
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Penses alors au tag .

    Chris.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par sinok
    Sauf que le JLabel déclenche un cerntain nombres de méthodes, qu'il faut repeindre le composant, ses bordures, déclencher d'hypothétiques évènement à chaque redéplacement et ça c'est lourd comparé à un simple drawString sur des graphics
    Je ne comprends pas cette réponse. Je ne dis pas d'hériter de JLabel, je dis juste qu'il est possible d'utiliser un jLabel et de le déplacer dans un panel sans layout. Il n'y a rien d'autre à faire à part un panel.validate() ou bien un jLabel.repaint(). Non ?

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    sauf que pour se repeindre le JLabel va faire appel à un certain nombre de méthodes par le biais de sa méthode paint:
    paintComponent()
    paintBorders()
    et ainsi de suite. ce qui s'avère au final plutôt lourd comparé à un simple drawString
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Ah d'accord, ce serait lourd en temps d'exécution, j'avais compris lourd en code...

Discussions similaires

  1. Faire défiler des photos dans un cadre
    Par philou029 dans le forum Langage
    Réponses: 2
    Dernier message: 04/06/2007, 14h19
  2. Probleme d'affichage de Message dans un Panel
    Par vorhax dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/04/2007, 21h13
  3. Faire défiler un texte dans un label
    Par FluidBlow dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/10/2006, 20h32
  4. Comment faire défiler une image dans un DBImage
    Par kolac dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/04/2006, 13h45
  5. Faire défiler un texte dans une cellule de tableau
    Par Furius dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 01/12/2005, 17h06

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