//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();
}
}