Have Label with many linesTag(s): AWT


The Label component included in the AWT do not support "\n" in its definition. The following class implements a multi-line Label. Lines are separated byt the token "\n". Lines can be left, right or center justified. Plus, there is a possibility to have a border around the label.
import java.awt.*;
import java.util.*;


public class MultiLineLabel extends Canvas {
  public static final int LEFT = 0;
  public static final int CENTER = 1;
  public static final int RIGHT = 2;
  private String text;
  private String lines[];
  private int num_lines;
  private int line_height;
  private int line_ascent;
  private int line_widths[];
  private int max_width;
  private int alignment;
  private boolean border;
  private int topBottomMargin;
  private int leftRightMargin;
  private int x = 0;
  private int y = 0;
  Dimension offDimension;
  Image offImage;
  Graphics offGraphics;
  Color borderColor = new Color(0).black;

  public MultiLineLabel(String s, int i, boolean b) {
    // s the label
    // i alignement MultiLineLabel.CENTER, MultiLineLabel.RIGHT,
    //   MultiLineLabel.LEFT
    //   default MultiLineLabel.LEFT
    // b border present or not
    setAlignment(i);
    setText(s);
    setBorder(b);
    }

  public MultiLineLabel(String string, int i) {
    this(string, i, false);
    }

  public MultiLineLabel(String string) {
    this(string, 0);
    }

  public MultiLineLabel() {
    this("", 0);
    }

  public void addNotify() {
    super.addNotify();
    calc();
    }

  public void setX(int i) { x = i;  }
  public void setY(int i) { y = i;  }


  public int getLeftRightMargin() {
    return leftRightMargin;
    }

  public void setLeftRightMargin(int i) {
    // make sense only if alignment is MultiLineLabel.LEFT!
    if (i >= 0)  leftRightMargin = i  ;
    }

  public int getAlignment() {
    return alignment;
    }

  public void setAlignment(int i) {
    switch (alignment) {
      case 0:
      case 1:
      case 2:
        alignment = i;
        break;
      default:
        throw new IllegalArgumentException();
      }
    repaint();
    }

  public int getTopBottomMargin() {
    return topBottomMargin;
    }

  public void setTopBottomMargin(int i) {
    if (i >= 0) topBottomMargin = i;
    }

  public void setFont(Font font) {
    super.setFont(font);
    calc();
    repaint();
    }

  public Dimension getMinimumSize() {
    Dimension d = new Dimension
       (max_width + leftRightMargin * 2,
        num_lines * line_height + topBottomMargin * 2);
    if (d.width == 0) d.width = 10;
    if (d.height == 0)  d.height = 10;
    return d;
    }

  public Dimension getPreferredSize() {
    return getMinimumSize();
    }

  public boolean getBorder() {
    return border;
    }

  public void setBorder(boolean flag) {
    border = flag;
    }

  public void setText(String s) {
    // parse the string , "\n" is a the line separator
    StringTokenizer st =
        new StringTokenizer(s,"\n");
    num_lines = st.countTokens();
    lines = new String[num_lines];
    line_widths = new int[num_lines];
    for (int i = 0; i < num_lines; i++)
        lines[i] = st.nextToken();
    calc();
    repaint();
    text = new String(s);
    }

  public String getText() {
    return text;
    }

  public Color getBorderColor() {
   return borderColor;
   }

  public void setBorderColor(Color c) {
   borderColor = c;
   }

  private void calc() {
    // calc dimension and extract maximum width
    Font f = getFont();
    if (f != null) {
      FontMetrics fm = getFontMetrics(f);
      if (fm != null) {
        line_height = fm.getHeight();
        line_ascent = fm.getAscent();
        max_width = 0;
        for (int i = 0; i < num_lines; i++) {
          line_widths[i] =
            fm.stringWidth(lines[i]);
          if (line_widths[i] > max_width)
             max_width = line_widths[i];
          }
        }
      }
    }

  public void update(Graphics g) {
    super.paint(g);
    Dimension d = getSize();
    if ( (offGraphics == null) ||
         (d.width != offDimension.width) ||
         (d.height != offDimension.height)
       ) {
      offDimension = d;
      offImage = createImage(d.width, d.height);
      offGraphics = offImage.getGraphics();
      }
    offGraphics.setColor(getBackground());
    offGraphics.fillRect
         (x, y, getSize().width - 1,
          getSize().height - 1);
    if (border) {
      offGraphics.setColor(borderColor);
      offGraphics.drawRect
         (x, y, getSize().width - 1, getSize().height - 1);
      }
    int j = line_ascent +
      (d.height - num_lines * line_height) / 2;
    for (int k = 0; k < num_lines; ) {
      int i;
      switch (alignment) {
        case 0:
          i = 0;
          break;
        case 2:
          i = d.width - line_widths[k];
          break;
        default:
          i = (d.width - line_widths[k]) / 2;
          break;
        }
      i += leftRightMargin;
      offGraphics.setColor(getForeground());
      offGraphics.drawString(lines[k], i + x, j + y);
      k++;
      j += line_height;
      }
    g.drawImage(offImage,0,0,this);
    }

  public void paint(Graphics g) {
    update(g);
    }

  public static void main(String args[]){
    Frame f = new Frame("Test MultiLineLabel");
    f.setSize(200,200);
    f.setLayout(new FlowLayout());
    f.setVisible(true);

    MultiLineLabel mll1 = new MultiLineLabel
      ("This a test!\nsecond line\nthird line",
       MultiLineLabel.LEFT, true);
    // mll1.setBorderColor(new Color(0).blue);
    mll1.setLeftRightMargin(15);
    mll1.setTopBottomMargin(15);
    f.add(mll1);

    Button b = new Button("Dummy");
    f.add(b);

    MultiLineLabel mll2 = new MultiLineLabel
      ("123\n4\n567", MultiLineLabel.RIGHT, false);
    mll2.setForeground(new Color(0).yellow);
    mll2.setBackground(new Color(0).black);
    f.add(mll2);

    f.validate();
    }
}

blog comments powered by Disqus