JLabel with various effects in Java

Description

The following code shows how to jLabel with various effects.

Example


/* w  w w  .j a  va2s. co  m*/
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.LineBorder;

public class Main {
  public static void main(String argv[]) {
    JFrame f = new JFrame("2D Labels");
    f.setSize(600, 300);
    f.getContentPane().setLayout(new GridLayout(6, 1, 5, 5));
    f.getContentPane().setBackground(Color.white);
    Font bigFont = new Font("Helvetica", Font.BOLD, 24);

    JLabel2D lbl = new JLabel2D("Java Source and Support With Outline",
        JLabel.CENTER);
    lbl.setFont(bigFont);
    lbl.setForeground(Color.blue);
    lbl.setBorder(new LineBorder(Color.black));
    lbl.setBackground(Color.cyan);
    lbl.setOutlineColor(Color.yellow);
    lbl.setStroke(new BasicStroke(5f));
    lbl.setOpaque(true);
    lbl.setShearFactor(0.3);
    f.getContentPane().add(lbl);

    lbl = new JLabel2D("Java Source and Support With Color Gradient",
        JLabel.CENTER);
    lbl.setFont(bigFont);
    lbl.setOutlineColor(Color.black);
    lbl.setEffectIndex(JLabel2D.EFFECT_GRADIENT);
    GradientPaint gp = new GradientPaint(0, 0, Color.red, 100, 50,
        Color.blue, true);
    lbl.setGradient(gp);
    f.getContentPane().add(lbl);

    lbl = new JLabel2D("Java Source and Support Filled With Image",
        JLabel.CENTER);
    lbl.setFont(bigFont);
    lbl.setEffectIndex(JLabel2D.EFFECT_IMAGE);
    ImageIcon icon = new ImageIcon("mars.gif");
    lbl.setForegroundImage(icon.getImage());
    lbl.setOutlineColor(Color.red);
    f.getContentPane().add(lbl);

    lbl = new JLabel2D("Java Source and Support With Image Animation",
        JLabel.CENTER);
    lbl.setFont(bigFont);
    lbl.setEffectIndex(JLabel2D.EFFECT_IMAGE_ANIMATION);
    icon = new ImageIcon("ocean.gif");
    lbl.setForegroundImage(icon.getImage());
    lbl.setOutlineColor(Color.black);
    lbl.startAnimation(400);
    f.getContentPane().add(lbl);

    lbl = new JLabel2D("Java Source and Support With Color Animation",
        JLabel.CENTER);
    lbl.setFont(bigFont);
    lbl.setEffectIndex(JLabel2D.EFFECT_COLOR_ANIMATION);
    lbl.setGradient(gp);
    lbl.setOutlineColor(Color.black);
    lbl.startAnimation(400);
    f.getContentPane().add(lbl);

    JLabel lbl1 = new JLabel(
        "Plain Java Source and Support For Comparison", JLabel.CENTER);
    lbl1.setFont(bigFont);
    lbl1.setForeground(Color.black);
    f.getContentPane().add(lbl1);

    WindowListener wndCloser = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    };
    f.addWindowListener(wndCloser);

    f.setVisible(true);

  }
}

class JLabel2D extends JLabel {
  public static final int EFFECT_PLAIN = 0;

  public static final int EFFECT_GRADIENT = 1;

  public static final int EFFECT_IMAGE = 2;

  public static final int EFFECT_IMAGE_ANIMATION = 3;

  public static final int EFFECT_COLOR_ANIMATION = 4;

  protected int effectIndex = EFFECT_PLAIN;

  protected double shearFactor = 0.0;

  protected Color outlineColor;

  protected Stroke stroke;

  protected GradientPaint gradient;

  protected Image foregroundImage;

  protected Thread animator;

  protected boolean isRunning = false;

  protected int m_delay;

  protected int m_xShift;

  public JLabel2D() {
    super();
  }

  public JLabel2D(String text) {
    super(text);
  }

  public JLabel2D(String text, int alignment) {
    super(text, alignment);
  }

  public void setEffectIndex(int e) {
    effectIndex = e;
    repaint();
  }

  public int getEffectIndex() {
    return effectIndex;
  }

  public void setShearFactor(double s) {
    shearFactor = s;
    repaint();
  }

  public double getShearFactor() {
    return shearFactor;
  }

  public void setOutlineColor(Color c) {
    outlineColor = c;
    repaint();
  }

  public Color getOutlineColor() {
    return outlineColor;
  }

  public void setStroke(Stroke s) {
    stroke = s;
    repaint();
  }

  public Stroke getStroke() {
    return stroke;
  }

  public void setGradient(GradientPaint g) {
    gradient = g;
    repaint();
  }

  public GradientPaint getGradient() {
    return gradient;
  }

  public void setForegroundImage(Image img) {
    foregroundImage = img;
    repaint();
  }

  public Image getForegroundImage() {
    return foregroundImage;
  }

  public void startAnimation(int delay) {
    if (animator != null)
      return;
    m_delay = delay;
    m_xShift = 0;
    isRunning = true;
    animator = new Thread() {
      double arg = 0;

      public void run() {
        while (isRunning) {
          if (effectIndex == EFFECT_IMAGE_ANIMATION)
            m_xShift += 10;
          else if (effectIndex == EFFECT_COLOR_ANIMATION
              && gradient != null) {
            arg += Math.PI / 10;
            double cos = Math.cos(arg);
            double f1 = (1 + cos) / 2;
            double f2 = (1 - cos) / 2;
            arg = arg % (Math.PI * 2);

            Color c1 = gradient.getColor1();
            Color c2 = gradient.getColor2();
            int r = (int) (c1.getRed() * f1 + c2.getRed() * f2);
            r = Math.min(Math.max(r, 0), 255);
            int g = (int) (c1.getGreen() * f1 + c2.getGreen() * f2);
            g = Math.min(Math.max(g, 0), 255);
            int b = (int) (c1.getBlue() * f1 + c2.getBlue() * f2);
            b = Math.min(Math.max(b, 0), 255);
            setForeground(new Color(r, g, b));
          }
          repaint();
          try {
            sleep(m_delay);
          } catch (InterruptedException ex) {
            break;
          }
        }
      }
    };
    animator.start();
  }

  public void stopAnimation() {
    isRunning = false;
    animator = null;
  }

  public void paintComponent(Graphics g) {
    Dimension d = getSize();
    Insets ins = getInsets();
    int x = ins.left;
    int y = ins.top;
    int w = d.width - ins.left - ins.right;
    int h = d.height - ins.top - ins.bottom;

    if (isOpaque()) {
      g.setColor(getBackground());
      g.fillRect(0, 0, d.width, d.height);
    }
    paintBorder(g);

    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY);

    FontRenderContext frc = g2.getFontRenderContext();
    TextLayout tl = new TextLayout(getText(), getFont(), frc);

    AffineTransform shear = AffineTransform.getShearInstance(shearFactor,
        0.0);
    Shape src = tl.getOutline(shear);
    Rectangle rText = src.getBounds();

    float xText = x - rText.x;
    switch (getHorizontalAlignment()) {
    case CENTER:
      xText = x + (w - rText.width) / 2;
      break;
    case RIGHT:
      xText = x + (w - rText.width);
      break;
    }
    float yText = y + h / 2 + tl.getAscent() / 4;

    AffineTransform shift = AffineTransform.getTranslateInstance(xText,
        yText);
    Shape shp = shift.createTransformedShape(src);

    if (outlineColor != null) {
      g2.setColor(outlineColor);
      if (stroke != null)
        g2.setStroke(stroke);
      g2.draw(shp);
    }

    switch (effectIndex) {
    case EFFECT_GRADIENT:
      if (gradient == null)
        break;
      g2.setPaint(gradient);
      g2.fill(shp);
      break;

    case EFFECT_IMAGE:
      fillByImage(g2, shp, 0);
      break;

    case EFFECT_COLOR_ANIMATION:
      g2.setColor(getForeground());
      g2.fill(shp);
      break;

    case EFFECT_IMAGE_ANIMATION:
      if (foregroundImage == null)
        break;
      int wImg = foregroundImage.getWidth(this);
      if (m_xShift > wImg)
        m_xShift = 0;
      fillByImage(g2, shp, m_xShift - wImg);
      break;

    default:
      g2.setColor(getForeground());
      g2.fill(shp);
      break;
    }
  }

  protected void fillByImage(Graphics2D g2, Shape shape, int xOffset) {
    if (foregroundImage == null)
      return;
    int wImg = foregroundImage.getWidth(this);
    int hImg = foregroundImage.getHeight(this);
    if (wImg <= 0 || hImg <= 0)
      return;
    g2.setClip(shape);
    Rectangle bounds = shape.getBounds();
    for (int xx = bounds.x + xOffset; xx < bounds.x + bounds.width; xx += wImg)
      for (int yy = bounds.y; yy < bounds.y + bounds.height; yy += hImg)
        g2.drawImage(foregroundImage, xx, yy, this);
  }

}

The code above generates the following result.

JLabel with various effects in Java




















Home »
  Java Tutorial »
    Swing »




Action
Border
Color Chooser
Drag and Drop
Event
Font Chooser
JButton
JCheckBox
JComboBox
JDialog
JEditorPane
JFileChooser
JFormattedText
JFrame
JLabel
JList
JOptionPane
JPasswordField
JProgressBar
JRadioButton
JScrollBar
JScrollPane
JSeparator
JSlider
JSpinner
JSplitPane
JTabbedPane
JTable
JTextArea
JTextField
JTextPane
JToggleButton
JToolTip
JTree
Layout
Menu
Timer