package javacodebook.media.text.shadow; import java.awt.*; import javax.swing.*; /** * Ein Label, dessen Text einen Schatten wirft. */ public class ShadowedLabel extends javax.swing.JPanel { private String text; private Color fontColor, shadowColor; private int xOffset, yOffset; /** * Eine neue Instanz von ShadowLabel erzeugen. * @param text - der anzuzeigende Text * @param fontColor - die Vordergrund-Farbe * @param shadowColor - die Schatten-Farbe * @param xOffset, yOffset - Entfernung des Schattens von der Schrift. Diese * Werte müssen positiv sein, da sonst der Schatten oberhalb der Schrift * geworfen wird. */ public ShadowedLabel(String text, Color fontColor, Color shadowColor, int xOffset, int yOffset) { this.text = text; this.fontColor= fontColor; this.shadowColor = shadowColor; if(xOffset < 0 || yOffset < 0) throw new IllegalArgumentException("Offset muss positiv sein"); this.xOffset = xOffset; this.yOffset = yOffset; } /** * Hier wird der Text zunächst leicht versetzt als Schatten gezeichnet, dann * in seiner eigentlichen Farbe an der normalen Position */ public void paintComponent(Graphics g) { //Das Panel korrekt darstellen super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; //Den Ursprung so verschieben, dass der Offset des Schattens //berücksichtigt wird g2.translate(xOffset, yOffset); //Den Schatten zeichnen g2.setColor(shadowColor); g2.drawString(text, 0, 0 + getFont().getSize()); //Ursprung wieder zurückverschieben g2.translate(-xOffset, -yOffset); //Den Text zeichnen g2.setColor(fontColor); g2.drawString(text, 0, 0 + getFont().getSize()); } /** * Das Panel hat eine optimale Größe, die von der Schriftart und -größe * abhängt. Diese werden hier berechnet. */ public Dimension getPreferredSize() { //Zur Laufweitenberechnung wird ein FontMetrics-Objekt benötigt FontMetrics fm = getFontMetrics(getFont()); //Länge des Textes in Pixel berechnen int width = fm.stringWidth(text) + xOffset; //Schriftgröße als Höhe int height = fm.getHeight(); return new Dimension(width, height); } public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().setLayout(new BorderLayout()); ShadowedLabel l = new ShadowedLabel("Schattenwurf", Color.white, Color.black, 3, 3); Font font = new Font("Helvetica", Font.BOLD, 36); l.setFont(font); f.getContentPane().add(l, BorderLayout.CENTER); f.pack(); f.show(); } }