/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * RichJLabel.java * * Created on 7. August 2007, 09:29 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package de.cismet.tools.gui; import java.awt.*; import java.awt.font.*; import javax.swing.*; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class RichJLabel extends JLabel { //~ Instance fields -------------------------------------------------------- private int tracking; private int left_x; private int left_y; private int right_x; private int right_y; private Color left_color; private Color right_color; //~ Constructors ----------------------------------------------------------- /** * Creates a new RichJLabel object. * * @param text DOCUMENT ME! * @param tracking DOCUMENT ME! */ public RichJLabel(final String text, final int tracking) { super(text); this.tracking = tracking; } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param x DOCUMENT ME! * @param y DOCUMENT ME! * @param color DOCUMENT ME! */ public void setLeftShadow(final int x, final int y, final Color color) { left_x = x; left_y = y; left_color = color; } /** * DOCUMENT ME! * * @param x DOCUMENT ME! * @param y DOCUMENT ME! * @param color DOCUMENT ME! */ public void setRightShadow(final int x, final int y, final Color color) { right_x = x; right_y = y; right_color = color; } @Override public Dimension getPreferredSize() { final String text = getText(); final FontMetrics fm = this.getFontMetrics(getFont()); int w = fm.stringWidth(text); w += (text.length() - 1) * tracking; w += left_x + right_x; int h = fm.getHeight(); h += left_y + right_y; return new Dimension(w, h); } @Override public void paintComponent(final Graphics g) { ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); final char[] chars = getText().toCharArray(); final FontMetrics fm = this.getFontMetrics(getFont()); final int h = fm.getAscent(); final LineMetrics lm = fm.getLineMetrics(getText(), g); g.setFont(getFont()); int x = 0; for (int i = 0; i < chars.length; i++) { final char ch = chars[i]; final int w = fm.charWidth(ch) + tracking; g.setColor(left_color); g.drawString("" + chars[i], x - left_x, h - left_y); // NOI18N g.setColor(right_color); g.drawString("" + chars[i], x + right_x, h + right_y); // NOI18N g.setColor(getForeground()); g.drawString("" + chars[i], x, h); // NOI18N x += w; } } /** * DOCUMENT ME! * * @param args DOCUMENT ME! */ public static void main(final String[] args) { final RichJLabel label = new RichJLabel("76", 0); // NOI18N /* * // drop shadow w/ highlight label.setLeftShadow(1,1,Color.white); label.setRightShadow(2,3,Color.black); * label.setForeground(Color.gray); label.setFont(label.getFont().deriveFont(140f)); */ // subtle outline label.setLeftShadow(1, 1, Color.white); label.setRightShadow(1, 1, Color.white); label.setForeground(Color.BLACK); label.setFont(label.getFont().deriveFont(26f)); /* * // 3d letters label.setLeftShadow(5,5,Color.white); label.setRightShadow(-3,-3, new Color(0xccccff)); * label.setForeground(new Color(0x8888ff)); label.setFont(label.getFont().deriveFont(140f)); */ final JFrame frame = new JFrame("RichJLabel hack"); // NOI18N frame.getContentPane().add(label); frame.pack(); frame.setVisible(true); } /** * DOCUMENT ME! * * @param str DOCUMENT ME! */ public static void p(final String str) { System.out.println(str); } }