package javacodebook.media.text.texture; import java.awt.*; import java.awt.image.*; import javax.swing.*; /** * Ein Textlabel, das mit einer beliebigen Grafik texturiert werden kann. */ public class TextureLabel extends javax.swing.JPanel { private String text; private TexturePaint paint; /** * Erzeugt ein neues TextureLabel mit dem angegebenen Text und der angegebenen * Grafik als Textur. */ public TextureLabel(String text, Image image) { this.text = text; //Die Größe der Grafik ermitteln int width = image.getWidth(this), height = image.getHeight(this); //Ein entsprechend grosses BufferedImage erzeugen BufferedImage buf = new BufferedImage(width, height, Transparency.OPAQUE); //Ein Graphics2D-Objekt erzeugen, mit dem in das BufferedImage //gezeichnet werden kann Graphics2D g = buf.createGraphics(); //Die Grafik in das BufferedImage zeichnen g.drawImage(image, 0,0, this); //Eine Texturfüllung erzeugen, die auf der Grafik basiert paint = new TexturePaint(buf, new Rectangle(0,0,width, height)); } /** * Text mit eingeschaltetem Antialising zeichnen. */ public void paintComponent(Graphics g) { //Das Panel korrekt darstellen super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; //Antialiasing einschalten, damit keine unschönen Ränder auftreten g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //Die Texturfüllung als Füllmuster verwenden g2.setPaint(paint); //Den Text zeichnen g2.drawString(text, 0, 0 + getFont().getSize()); } /** Die bevorzugte Größe für den Text berechnent */ 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); //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()); ImageIcon icon = new ImageIcon(f.getClass().getClassLoader(). getSystemResource("javacodebook/media/text/texture/Textur.jpg")); TextureLabel l = new TextureLabel("Texturiert", icon.getImage()); Font font = new Font("Helvetica", Font.BOLD, 64); l.setFont(font); f.getContentPane().add(l, BorderLayout.NORTH); f.pack(); f.show(); } }