Multi-label Label
//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<num_lines;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<prevNum;i++) lines[i] = prev[i]; for (int i=prevNum;i<num_lines;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<num_lines;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<num_lines; 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(); } }