Swing Components Java

//package gameEngine.graphics.utils;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.SystemColor;
import java.util.StringTokenizer;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
 
/**
 * A class that allows the use a Multi-label Label
 *
 * @author      Internet
 */
public class MultiLabel extends JComponent implements SwingConstants
{
  private static final long serialVersionUID = -1611795277013703880L;
  int num_lines,line_height,line_ascent;
    int max_width  = -1;
    int text_height = -1;
    int[] line_widths;
    int btnMarginWidth =1;
    
    private String lines[]=null;
    
    private int horizontalAlignment = LEADING;
    private int textAlignment       = LEADING;
    private int verticalAlignment   = CENTER;
    
    public MultiLabel()
    {
        this("", LEADING, LEADING, CENTER);
    }
    public MultiLabel(String text)
    {
        this(text, LEADING, LEADING, CENTER);
    }
    public MultiLabel(String text, int horizontalAlignment)
    {
        this(text, horizontalAlignment, LEADING, CENTER);
    }
    public MultiLabel(String text, int horizontalAlignment, int textAlignment)
    {
        this(text, horizontalAlignment, textAlignment, CENTER);
    }
    public MultiLabel(String str, int horizontalAlignment, int textAlignment, int verticalAlignment)
    {
        this.setForeground(UIManager.getColor("Label.foreground"));
        this.setBackground(UIManager.getColor("Label.background"));
        this.setFont      (UIManager.getFont ("Label.font"));
        
        setText(str);
        this.horizontalAlignment = horizontalAlignment;
        this.textAlignment = textAlignment;
        this.verticalAlignment = verticalAlignment;
    }
    
    public void setText(String text)
    {
        if (text == null) text="";
        
        StringTokenizer tkn = new StringTokenizer(text,"\n");
        
        num_lines = tkn.countTokens();
        lines       = new String[num_lines];
        line_widths = new int   [num_lines];
        
        for (int i=0;i            lines[i] = tkn.nextToken();
        
        recalculateDimension();
    }
    
    public void addText(String text)
    {
      if (text == null) text="";
      StringTokenizer tkn = new StringTokenizer(text,"\n");
        
        String[] prev = new String[num_lines];
        int prevNum = num_lines;
        for (int i = 0 ; i < num_lines ; i++)
        {
          prev[i] = lines[i];
        }
        
        num_lines += tkn.countTokens();
        lines       = new String[num_lines];
        line_widths = new int   [num_lines];
        
        for (int i=0;i            lines[i] = prev[i];
        
        for (int i=prevNum;i            lines[i] = tkn.nextToken();
        
        recalculateDimension();
    }
   
    private void recalculateDimension()
    {
        FontMetrics fontmetrics=getFontMetrics(getFont());
        
        line_height=fontmetrics.getHeight();
        line_ascent=fontmetrics.getAscent();
        
        max_width=0;
        for (int i=0;i        {
            line_widths[i] = fontmetrics.stringWidth(lines[ i ]);
            
            max_width = Math.max(max_width, line_widths[i]);
        }
        
        max_width += 2*btnMarginWidth;
        text_height=num_lines*line_height;
   }
 
 
    public Dimension getPreferredSize()
    {
        return getMinimumSize();
    }
   
    public Dimension getMaximumSize()
    {
        return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);
    }
    
    public Dimension getMinimumSize()
    {
        if (max_width == -1 || text_height == -1) recalculateDimension();
        
        Insets insets = getInsets();
        
        return new Dimension(max_width   + insets.left + insets.right,
                             text_height + insets.top  + insets.bottom);
    }
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Dimension d = getSize();
 
        if (d.width  != max_width || d.height != text_height)
            recalculateDimension();
        
        Insets insets = this.getInsets();
        
        int y = 0;
        
        if (verticalAlignment == TOP)
        {
            y = insets.top + line_ascent;                
        }
        else if (verticalAlignment == CENTER)
        {
         //These two are must musts:
            y = insets.top + line_ascent;
            
          //So far it looks like the TOP case, BUT:
            int clientAreaHeight = d.height - insets.top - insets.bottom;
            y = y + (clientAreaHeight - text_height) / 2;
        }
        else if (verticalAlignment == BOTTOM)
        {
            int clientAreaBottom = d.height - insets.bottom;
            
            y = clientAreaBottom - text_height;
            
            y += line_ascent;   
        }
        
        
        for (int i=0; i        {
            int ha = getBidiHorizontalAlignment(horizontalAlignment);
            
            int x = 0;
            
            if (ha == LEFT)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
                     if (ha == LEFT  ) x = insets.left;
                else if (ha == RIGHT ) x = max_width - line_widths[i] + insets.left;
                else if (ha == CENTER) x = insets.left + (max_width - line_widths[i]) / 2;
            }
            else if (ha == RIGHT)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
                     if (ha == LEFT  ) x = d.width - max_width - insets.right;
                else if (ha == RIGHT ) x = d.width - line_widths[i] - insets.right;
                else if (ha == CENTER) x = d.width - max_width - insets.right+ (max_width - line_widths[i]) / 2;
            }
            else if (ha == CENTER)
            {
                ha = getBidiHorizontalAlignment(textAlignment);
                
             // Just imagine that ha=LEFT (much easier), and follow code
                int  clientAreaWidth = d.width - insets.left - insets.right;
                     if (ha == LEFT  ) x = insets.left + (clientAreaWidth - max_width) / 2;
                else if (ha == RIGHT ) x = insets.left + (clientAreaWidth - max_width) / 2 + (max_width-line_widths[i]);
                else if (ha == CENTER) x = insets.left + (clientAreaWidth - line_widths[i]) / 2;
            }
            x+=btnMarginWidth;
            g.drawString(lines[i],x,y);
            
            y+=line_height;
        }
   }
   
   private int getBidiHorizontalAlignment(int ha)
   {
        if (ha == LEADING) 
        {
            if (getComponentOrientation().isLeftToRight())
                 ha = LEFT;
            else ha = RIGHT;
        }
        else if (ha == TRAILING)
        {
            if (getComponentOrientation().isLeftToRight())
                 ha = RIGHT;
            else ha = LEFT;
        }
        return ha;
    }
    
    public int getVerticalAlignment()
    {
        return this.verticalAlignment;
    }
    
    public void setVerticalAlignment(int verticalAlignment)
    {
        this.verticalAlignment = verticalAlignment;
        repaint();
    }
    
    
    
    public int getHorizontalAlignment()
    {
        return this.horizontalAlignment;
    }
    
    public void setHorizontalAlignment(int horizontalAlignment)
    {
        this.horizontalAlignment = horizontalAlignment;
        repaint();
    }
    
    
    
    public int getTextAlignment()
    {
        return this.textAlignment;
    }
    
    public void setTextAlignment(int textAlignment)
    {
        this.textAlignment = textAlignment;
        repaint();
    }
 
   
    @SuppressWarnings("deprecation")
  public static void main(String args[]) throws Exception
    {
        String wiseText = "This is a true example\n"+
                          "Of the MultiLine"  + "\n" +
                          "Label class";
        
        MultiLabel x0 = new MultiLabel(wiseText);
        MultiLabel x1 = new MultiLabel(wiseText, MultiLabel.RIGHT , MultiLabel.RIGHT);
        MultiLabel x2 = new MultiLabel(wiseText, MultiLabel.CENTER);
        MultiLabel x3 = new MultiLabel(wiseText, MultiLabel.CENTER, MultiLabel.RIGHT);
        MultiLabel x4 = new MultiLabel(wiseText, MultiLabel.CENTER, MultiLabel.CENTER);
        MultiLabel x5 = new MultiLabel(wiseText, MultiLabel.RIGHT , MultiLabel.LEFT, MultiLabel.BOTTOM);
        
        JPanel
        mainPanel = new JPanel(new GridLayout(3,2,15,15));
        mainPanel.add(x0);  mainPanel.add(x1);
        mainPanel.add(x2);  mainPanel.add(x3);
        mainPanel.add(x4);  mainPanel.add(x5);
        mainPanel.setBackground(SystemColor.control);
        mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        for (int i=0; i < mainPanel.getComponentCount(); i++)
            ((JComponent) mainPanel.getComponent(i)).setBorder(new LineBorder(Color.red));
        
        
        JFrame fr = new JFrame("MultiLabel Example");
        fr.getContentPane().add(mainPanel);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setSize(460,350);
        fr.setLocationRelativeTo(null);
        fr.show();       
    }
}