We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

Scrolling text horizontally in a JLabel within a Java app

Cyart
Cyart asked
on
Medium Priority
795 Views
Last Modified: 2008-02-01
Hello,

I am after some information on how the above is possible, I did use a timer but caused major issues with screen updating, would like to know if this can be done using threads as I did try a Swingworker class but this caused the same issue. Any information would be much appreciated.

cheers

Cyart
Comment
Watch Question

CERTIFIED EXPERT
Top Expert 2016

Commented:
You need a *SWing* Timer
zzynxSr. Software engineer
CERTIFIED EXPERT

Commented:
This can surely inspire you:

CreditsScroller.java
------------------------

import java.awt.*;
import javax.swing.*;

public class CreditsScroller extends JPanel implements Runnable {

     private boolean stop = false;
     String[] headlines = {

     " This program was made by Computer Wizard :", "",
     "                Cyart           ", };

     int y = 76;
     
     public void stopIt() {
         stop = true;
     }

     public void run() {

          while (!stop) {
              y = y - 1;

              if (y < -650)
              y = 76;

              repaint();

              try {
              Thread.sleep(30);
              } catch (InterruptedException e) {
              }
          }
     }

     public void paintComponent(Graphics comp) {

          Graphics2D comp2D = (Graphics2D) comp;
          Font type = new Font("monospaced", Font.BOLD, 14);
          comp2D.setFont(type);
          comp2D.setBackground(Color.black);
          comp2D.fillRect(0, 0, getSize().width, getSize().height);
          comp2D.setColor(Color.white);
          for (int i = 0; i < headlines.length; i++)
            comp2D.drawString(headlines[i], 5, y + (20 * i));
     }
}

CreditScrollDemo.java
----------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CreditScrollDemo extends JFrame {

     CreditsScroller news = new CreditsScroller();
     private Thread scroller = new Thread(news);

     public CreditScrollDemo() {
         super("Authors . . .");
         setSize(400, 300);
         JPanel pane = new JPanel();
         pane.setLayout(new GridLayout(1, 1, 15, 15));
         pane.add(news);
         setContentPane(pane);
         setVisible(true);
         scroller.start();
     }
     
     public void stopScrollThread() {
         news.stopIt();
     }
     
     public static void main(String[] arguments) {
        final CreditScrollDemo app = new CreditScrollDemo();
        app.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 app.stopScrollThread();
             }
        });
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
}  
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010
Commented:
you wouldn't use a JLabel, smoothest can be acieved by painting to an offscreen image and displaying that image.
and you don't need a thread or swing worker either, a timer is all u need.
there are 1000's of these available on the net, just do a search for a ticker

Not the solution you were looking for? Getting a personalized solution is easy.

Ask the Experts

Author

Commented:
Just been trying to find ticker examples and it all seems to point to applets.

zzynx, I will look at the code later as I have not got java installed on this PC
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
> Just been trying to find ticker examples and it all seems to point to applets.

applets are no different than applications for what you want to do, they just run in a browser.
The code to do the ticker can also be used in an application.
zzynxSr. Software engineer
CERTIFIED EXPERT

Commented:
>> zzynx, I will look at the code later as I have not got java installed on this PC
That's OK
CERTIFIED EXPERT
Top Expert 2016
Commented:
Try something like this:


class ScrollingBannerLabel extends JLabel implements ActionListener {
      private Image offscreenImage;

      private Timer timer;

      private int delay;

      private int deltaX;

      private int x, y;

      public ScrollingBannerLabel(String text) {
            super(text);
            deltaX = 1;
            delay = 50;
      }

      /*
       * (non-Javadoc)
       *
       * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
       */
      protected void paintComponent(Graphics g) {
            if (offscreenImage == null) {
                  offscreenImage = new BufferedImage(getWidth(), getHeight(),
                              BufferedImage.TYPE_INT_RGB);
                  Graphics imageGraphics = offscreenImage.getGraphics();
                  imageGraphics.setColor(Color.white);
                  imageGraphics.fillRect(0, 0, offscreenImage.getWidth(this),
                              offscreenImage.getHeight(this));
                  super.paintComponent(imageGraphics);
            }
            g.drawImage(offscreenImage, x, y, this);

      }

      public void startScroll() {
            if (timer == null) {
                  timer = new Timer(delay, this);
            }
            timer.start();
      }

      public void stopScroll() {
            if (timer != null) {
                  timer.stop();
            }
      }

      public void actionPerformed(ActionEvent e) {
            x += deltaX;
            int width = getWidth();
            if (x > width) {
                  x = -width;
            }
            repaint();
      }
}
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
Looks like CEHJ agreed with my suggestions , and saved me some typing :)
CERTIFIED EXPERT
Top Expert 2016

Commented:
>>Looks like CEHJ agreed with my suggestions

No ;-)

>>you wouldn't use a JLabel,

>>ScrollingBannerLabel extends JLabel
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
Didn't say your implementation was perfect, it includes a few other little *issues* as well :)
The type of component is actually irrelevant, using a JLabel will work it just carries extra innecessary baggage that u don't need.
You could equally use a JPanel or even a JComponent.

Author

Commented:
Thanks for the info

How does this code work so that it wraps the text around the GUI

 /*
      * (non-Javadoc)
      *
      * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
      */
     protected void paintComponent(Graphics g) {
          if (offscreenImage == null) {
               offscreenImage = new BufferedImage(getWidth(), getHeight(),
                         BufferedImage.TYPE_INT_RGB);
               Graphics imageGraphics = offscreenImage.getGraphics();
               imageGraphics.setColor(Color.white);
               imageGraphics.fillRect(0, 0, offscreenImage.getWidth(this),
                         offscreenImage.getHeight(this));
               super.paintComponent(imageGraphics);
          }
          g.drawImage(offscreenImage, x, y, this);
CERTIFIED EXPERT
Top Expert 2016

Commented:
The value of 'x' increments on firing of the Timer. If it gets too large it will wrap by setting x to -width
Mick BarryJava Developer
CERTIFIED EXPERT
Top Expert 2010

Commented:
> How does this code work so that it wraps the text around the GUI

it doesn't. the wrapping is handled where:

         if (x > width) {
               x = -width;
          }
CERTIFIED EXPERT
Top Expert 2016

Commented:
:-)
Access more of Experts Exchange with a free account
Thanks for using Experts Exchange.

Create a free account to continue.

Limited access with a free account allows you to:

  • View three pieces of content (articles, solutions, posts, and videos)
  • Ask the experts questions (counted toward content limit)
  • Customize your dashboard and profile

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.