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 :

Texte défilant de bas en haut mais qui sort du JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut Texte défilant de bas en haut mais qui sort du JPanel
    Voici mon code pour obtenir un texte défilant, de bas en haut. Il marche nikel mais j'aimerais pouvoir afficher autant de texte que je souhaite sans qu'il sorte du JPanel, mais je n'y arrive pas. En clair, j'aimerais que le JLabel que je fais défiler revienne à la ligne si jamais il dépasse la taille du JPanel.
    J'ai essayé d'appeler plusieurs fois ma classe en changeant le 'String text' ou en remplaçant mon JPanel par un JTextArea pour utiliser la méthode setLineWrap(true); mais sans succès.

    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
     
    import java.awt.Dimension;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.util.Timer;
    import java.util.TimerTask;
     
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class PanelTexteDéfilant extends JPanel
    {
    	public PanelTexteDéfilant()
    	{
    		final class JScrollingText extends JLabel 
    		{ 
    			private int speed;
    			private int period; 
    			private int y;
     
    			// Méthodes surchargées = 2 Constructeurs
    			public JScrollingText(String text,int speed) {this(text,speed,100);}
     
    			public JScrollingText(String text,int speed,int period) {this(text,speed,period,0);}
     
    			public void paintComponent(Graphics g) 
    			{
    			    if (isOpaque()) {
    			        g.setColor(getBackground());
    			        g.fillRect(0,0,getHeight(),getWidth());
    			    }
    			    g.setColor(getForeground());
     
    			    FontMetrics fm = g.getFontMetrics();
    			    Insets insets = getInsets();
     
    			    int width = getWidth() - (insets.top + insets.bottom);
    			    int height = getHeight() - (insets.left + insets.right);
     
    			    int textHeight = fm.getHeight(); 
    			    if (height < textHeight) {
    			        height = textHeight;
    			    }
    			    y %= height;
     
    			    int textX = insets.left + (width - fm.stringWidth(getText()))/2; // Centre le texte
    			    int textY = insets.top + y; 
     
    			    g.drawString(getText(),textX,textY);
    			    g.drawString(getText(),textX ,textY + (speed > 0 ? - height : height));
    			}
     
    			public void start() 
    			{
    			    Timer timer = new Timer();
    			    TimerTask task = new TimerTask() {
    			       public void run() {
    			            y = y + speed;
    			            repaint();
    			        }
    			    };
    			    timer.scheduleAtFixedRate(task,0,period);
    			}  
    		}
     
    		JScrollingText scrollingText1 = new JScrollingText("Coucou",-1);
    	    scrollingText1.start();
    	    setPreferredSize(new Dimension(200,330));
                     setLayout(new BorderLayout());
    	    add(scrollingText1);
    	}
    }
    J'espère que vous aurez des réponses à mon problème.
    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    En fait, j'aimerais mettre plusieurs lignes de texte et non une seule.
    Merci.

  3. #3
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Soit tu gères toi même tes lignes dans ton paint (je ne te le conseille pas) (mais ce serait un excellent exercice), soit tu utilises d'autres composants, comme le JTextPane ou le JLabel qui font ça tout seul, et tu gères la mécanique pour faire défiler non plus le texte, mais le composant.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    J'ai eu l'idée également de créer une image avec mon texte et de la faire défiler ainsi, ca pourrait marcher surement.
    Peux tu me donner des indications pour pouvoir faire défiler le composant.
    Merci.

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Pour l'idée de créer un texte-image, il existe la technique du Renderer. Vois à ce mot clef.

    Pour l'idée de faire défiler un composant-texte dans un autre composant, tu peux placer un layout à null dans cet autre composant, lui affecter une preferredSize - ou du moins quelque chose de compréhensible par le layout du conteneur de l'autre composant -, faire défiler ton composant-texte avec setLocation, puis, selon ce que l'Esprit Java voudra, faire et/ou repaint et/ou validate et/ou revalidate et/ou invalidate (problème jamais clair avec swing).
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci pour ton aide mais pour l'instant, je vais faire un standby sur ce texte qui défile, je suis débutant et pour moi ce n'est pas aussi clair que pour toi.
    Je m'y remettrai quand je serais plus efficace.
    Merci en tout cas, bye.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    J'ai eu à l'idée d'étendre ma classe JScrollingText avec un JTextArea ou un JScrollPane, mais pensez vous que c'est possible de faire défiler un JTextArea ou un JScrollPane en entier dans un JPanel ?
    Si vous avez des suggestions pour m'aider à réaliser ce que je souhaite, je vous écouterais avec grande joie.

    Voici mon 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
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.BorderLayout;
     
    import java.util.Timer;
    import java.util.TimerTask;
     
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.JTextArea;
     
    public class PanelTexteDefilant extends JPanel
    {
    	private static final long serialVersionUID = 0;
    	public PanelTexteDefilant()
    	{
    		// TODO : Afficher plusieurs lignes de texte
    		setLayout(new BorderLayout());
    		// Dimensions : 200x330 (328+2 : 2 fois la taille d'une image d'un diaporama + 2 pixels pour les marges)
    	    setPreferredSize(new Dimension(200,330));
     
    		JScrollingText scrollingText = new JScrollingText("Coucou",-1,100);
    	    scrollingText.start();
     
    	    add(scrollingText);
    	}
     
    	class JScrollingText extends JLabel 
    	{
    		private static final long serialVersionUID = 0;
    		private int speed;
    		private int period; 
    		private int y;
     
    		public JScrollingText(String text,int speed,int period)
    		{
    			super(text); this.speed = speed; this.period = period;
    			setForeground(Color.blue);
    			setFont(new Font("Helvetica",Font.ITALIC,12));
    		}
     
    		public void paintComponent(Graphics g) 
    		{
    		    if (isOpaque()) {
    		        g.setColor(getBackground());
    		        g.fillRect(0,0,getHeight(),getWidth());
    		    }
    		    g.setColor(getForeground());
     
    		    FontMetrics fm = g.getFontMetrics();
    		    Insets insets = getInsets();
     
    		    int width = getWidth() - (insets.top + insets.bottom);
    		    int height = getHeight() - (insets.left + insets.right);
     
    		    int textHeight = fm.getHeight(); 
    		    if (height < textHeight) {
    		        height = textHeight;
    		    }
    		    y %= height;
     
    		    int textX = insets.left + (width - fm.stringWidth(getText()))/2; // Centre le texte
    		    int textY = insets.top + y; 
     
    		    g.drawString(getText(),textX,textY);
    		    // Permet de réafficher tout de suite les pixels du JLabel qui disparaissent 
    		    g.drawString(getText(),textX ,textY + (speed > 0 ? - height : height));
    		}
     
    		public void start() 
    		{
    		    Timer timer = new Timer();
    		    TimerTask task = new TimerTask() 
    		    {
    		       public void run() 
    		       {
    		            y = y + speed;
    		            repaint();
    		        }
    		    };
    		    timer.scheduleAtFixedRate(task,0,period);
    		}  
    	}
    }
    Merci. A+

  8. #8
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    En tous les cas c'est bien, ça marche

    Moi je n'aurais pas redéfini paintComponent, mais juste provoqué le réaffichage du JLabel par repaint ou assimilé, après avoir changé sa position, car avec ton code tu ne profites absolument pas que c'est un JLabel, à part pour la mémorisation du texte, que tu aurais très bien pu mémoriser dans un attribut à toi.

    Enfin, si l'on avait toujours le temps de couper les cheveux en 4...
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Avez vous une idée de comment je pourrais procéder pour faire défiler un JTextArea ou un JScrollPane à la place de mon JLabel pour obtenir un texte entier qui défile ou non pas juste une ligne ??
    Merci

  10. #10
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Voilà un petit exemple avec un JLabel ; c'est exactement le même principe avec n'importe quel autre JComponent, et d'ailleurs tu remarqueras que le service de défilement accepte n'importe quoi.

    Il y a quelques trucs à pinaller, évidemment, et je laisse faire la communauté à ce sujet !
    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
     
    package zou;
     
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Timer;
     
    public class CompoScroll
    {
      public static void main(String[] args)
      {
        EventQueue.invokeLater(new java.lang.Runnable()
        {
          public void run()
          {
            JFrame jf;
            JPanel zonescroll;
            JLabel àscroller;
            Timer timing;
            PourScroller pourscroller;
     
            jf = new JFrame();
            jf.setLayout(new BorderLayout());
            zonescroll = new JPanel();
            zonescroll.setPreferredSize(new Dimension(200, 400));
            zonescroll.setLayout(null);
            àscroller = new JLabel("<html>J'ai <br>plusieurs<br>lignes.");
            àscroller.setSize(àscroller.getPreferredSize());
            zonescroll.add(àscroller);
            jf.add(zonescroll);
            timing = new Timer(20, new PourScroller(àscroller));
            timing.start();
            jf.pack();
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
          }
        });
      }
     
      private static class PourScroller implements java.awt.event.ActionListener
      {
        private JComponent m_àScroller;
     
        private PourScroller(JComponent àScroller)
        {
          m_àScroller = àScroller;
        }
     
        public void actionPerformed(ActionEvent e)
        {
          Container container;
          Point positionducomposant;
     
          container = m_àScroller.getParent();
          positionducomposant = m_àScroller.getLocation();
          positionducomposant.y += 2;
          if (positionducomposant.y > m_àScroller.getParent().getSize().height)
            positionducomposant.y = 0;
          positionducomposant.x = 50;
          m_àScroller.setLocation(positionducomposant);
          m_àScroller.getParent().repaint();
        }
      }
    }
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ca marche nickel, merci !

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

Discussions similaires

  1. [AC-2003] Formulaire: texte vertical de bas en haut
    Par Loudjé dans le forum IHM
    Réponses: 12
    Dernier message: 24/01/2012, 09h00
  2. [JTabbedPane] afficher texte étiquette bas en haut.
    Par spoutyoyo dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 07/07/2009, 17h46
  3. Mais qui donc travail sur l'ordinateur la bas
    Par borislotte dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/06/2007, 19h11
  4. [FLASH MX2004] Texte défilant de bas en haut sous un masque !
    Par °°° Zen-Spirit °°° dans le forum Flash
    Réponses: 18
    Dernier message: 28/05/2006, 01h02
  5. Ecrire un text de bas en haut
    Par kcizth dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/02/2006, 09h23

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