--- /dev/null
+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;
+ protected String[] lines;
+ protected int num_lines;
+ protected int margin_width;
+ protected int margin_height;
+ protected int line_height;
+ protected int line_ascent;
+ protected int[] line_widths;
+ protected int max_width;
+ protected int alignment = LEFT;
+
+ protected void newLabel(String label) {
+ StringTokenizer t = new StringTokenizer(label,"\n");
+ num_lines = t.countTokens();
+ lines = new String[num_lines];
+ line_widths = new int[num_lines];
+ for(int i = 0; i < num_lines; i++) lines[i] = t.nextToken();
+ }
+
+ protected void measure() {
+ FontMetrics fm = this.getFontMetrics(this.getFont());
+ if (fm == null) return;
+
+ 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 MultiLineLabel(String label, int margin_width,
+ int margin_height, int alignment) {
+ newLabel(label);
+ this.margin_width = margin_width;
+ this.margin_height = margin_height;
+ this.alignment = alignment;
+ }
+
+ public MultiLineLabel(String label, int margin_width, int margin_height) {
+ this(label, margin_width, margin_height, LEFT);
+ }
+
+ public MultiLineLabel(String label, int aligment) {
+ this(label, 10, 10, aligment);
+ }
+
+ public MultiLineLabel(String label) {
+ this(label, 10, 10, LEFT);
+ }
+
+ public void setLabel(String label) {
+ newLabel(label);
+ measure();
+ repaint();
+ }
+
+ public void setFont(Font f) {
+ super.setFont(f);
+ measure();
+ repaint();
+ }
+
+ public void setForegroundColor(Color c) {
+ super.setForeground(c);
+ repaint();
+ }
+
+ public void setAligment(int a) { alignment = a; repaint(); }
+ public void setMarginWidth(int mw) { margin_width = mw; repaint(); }
+ public void setMarginHeight(int mh) { margin_height = mh; repaint(); }
+ public int getAlignment() { return alignment; }
+ public int getMarginWidth() { return margin_width; }
+ public int getMarginheight() { return margin_height; }
+
+ public void addNotify() { super.addNotify(); measure(); }
+
+ public Dimension preferedSize() {
+ return new Dimension(max_width + 2 * margin_width,
+ num_lines * line_height + 2 * margin_height);
+ }
+
+ public Dimension miniumSize() {
+ return new Dimension(max_width, num_lines * line_height);
+ }
+
+ public void paint(Graphics g) {
+ int x,y;
+ Dimension d = this.size();
+ y = line_ascent + (d.height - num_lines * line_height) / 2;
+ for(int i = 0; i < num_lines; i++, y += line_height) {
+ switch(alignment) {
+ case LEFT:
+ x = margin_width; break;
+ case CENTER:
+ default:
+ x = (d.width - line_widths[i]) / 2; break;
+ case RIGHT:
+ x = d.width - margin_width - line_widths[i]; break;
+ }
+ g.drawString(lines[i], x, y);
+ }
+ }
+}