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
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    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 éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    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
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    La version avec un JLabel tu peux l'oublier, ce serait trop lourd de faire ça.

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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

  7. #7
    Membre éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    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
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 9
    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 éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

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

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

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

  11. #11
    Membre éclairé

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

    Informations professionnelles :
    Activité : Coach Agile

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

    Chris.

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    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 confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    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

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 43
    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