Link to home
Start Free TrialLog in
Avatar of Cyart
CyartFlag for United Kingdom of Great Britain and Northern Ireland

asked on

Scrolling text horizontally in a JLabel within a Java app

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
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

You need a *SWing* Timer
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);
     }
}  
SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Cyart

ASKER

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
> 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.
>> zzynx, I will look at the code later as I have not got java installed on this PC
That's OK
ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Looks like CEHJ agreed with my suggestions , and saved me some typing :)
>>Looks like CEHJ agreed with my suggestions

No ;-)

>>you wouldn't use a JLabel,

>>ScrollingBannerLabel extends JLabel
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.
Avatar of Cyart

ASKER

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);
The value of 'x' increments on firing of the Timer. If it gets too large it will wrap by setting x to -width
> 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;
          }
:-)