All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdesktop.swingx.painter.TextPainter Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package org.jdesktop.swingx.painter;

import static org.jdesktop.swingx.painter.PainterUtils.getComponentFont;
import static org.jdesktop.swingx.painter.PainterUtils.getForegroundPaint;

import java.awt.Component;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.font.GlyphVector;

import javax.swing.AbstractButton;
import javax.swing.JLabel;
import javax.swing.text.JTextComponent;

import org.jdesktop.beans.JavaBean;
import org.jdesktop.swingx.painter.effects.AreaEffect;

/**
 * A painter which draws text. If the font, text, and paint are not provided they will be
 * obtained from the object being painted if it is a Swing text component.
 * 

* There are demos: *
- Text Painter Demos *
- Compound Painter Transform Demos : ... *
- Compound Painter Gradient Demos : "text on blue", "A Cool Logo", "Coming Soon badge" *

* * @author rbair */ //@see PainterDemo#createTextPainterDemos() @JavaBean public class TextPainter extends AbstractAreaPainter { /** * {@inheritDoc} */ @Override // implements the abstract method AbstractPainter.doPaint protected void doPaint(Graphics2D g, Component component, int width, int height) { Font f = calculateFont(component); if (f != null) { g.setFont(f); } Paint paint = getForegroundPaint(getFillPaint(), component); String t = calculateText(component); // get the font metrics FontMetrics metrics = g.getFontMetrics(g.getFont()); //Rectangle2D rect = metrics.getStringBounds(text,g); int tw = metrics.stringWidth(t); int th = metrics.getHeight(); Rectangle res = calculateLayout(tw, th, width, height); g.translate(res.x, res.y); if(isPaintStretched()) { paint = calculateSnappedPaint(paint, res.width, res.height); } if (paint != null) { g.setPaint(paint); } g.drawString(t, 0, 0 + metrics.getAscent()); if(getAreaEffects() != null) { Shape shape = provideShape(g, component, width, height); for(AreaEffect ef : getAreaEffects()) { ef.apply(g, shape, width, height); } } g.translate(-res.x,-res.y); } private String text = ""; private Font font = null; /** Creates a new instance of TextPainter */ public TextPainter() { this(""); } /** * Create a new TextPainter which will paint the specified text * @param text the text to paint */ public TextPainter(String text) { this(text, null, null); } /** * Create a new TextPainter which will paint the specified text with the specified font. * @param text the text to paint * @param font the font to paint the text with */ public TextPainter(String text, Font font) { this(text, font, null); } /** * Create a new TextPainter which will paint the specified text with the specified paint. * @param text the text to paint * @param paint the paint to paint with */ public TextPainter(String text, Paint paint) { this(text, null, paint); } /** * Create a new TextPainter which will paint the specified text with the specified font and paint. * @param text the text to paint * @param font the font to paint the text with * @param paint the paint to paint with */ public TextPainter(String text, Font font, Paint paint) { this.text = text; this.font = font; setFillPaint(paint); } /** * Set the font (and font size and style) to be used when drawing the text * @param f the new font */ public void setFont(Font f) { Font old = getFont(); this.font = f; setDirty(true); firePropertyChange("font", old, getFont()); } /** * gets the font (and font size and style) to be used when drawing the text * @return the current font */ public Font getFont() { return font; } /** * Sets the text to draw * @param text the text to draw */ public void setText(String text) { String old = getText(); this.text = text == null ? "" : text; setDirty(true); firePropertyChange("text", old, getText()); } /** * gets the text currently used to draw * @return the text to be drawn */ public String getText() { return text; } private String calculateText(final Object component) { // prep the text String t = getText(); //make components take priority if(text == null || text.trim().equals("")) { if(t != null && !t.trim().equals("")) { return t; } if(component instanceof JTextComponent) { t = ((JTextComponent)component).getText(); } if(component instanceof JLabel) { t = ((JLabel)component).getText(); } if(component instanceof AbstractButton) { t = ((AbstractButton)component).getText(); } return t; } private Font calculateFont(final Object component) { // prep the various text attributes Font f = getComponentFont(getFont(), component); if (f == null) { f = new Font("Dialog", Font.PLAIN, 18); } return f; } /** * {@inheritDoc} */ @Override protected Shape provideShape(Graphics2D g2, Component comp, int width, int height) { Font f = calculateFont(comp); String t = calculateText(comp); FontMetrics metrics = g2.getFontMetrics(f); GlyphVector vect = f.createGlyphVector(g2.getFontRenderContext(),t); return vect.getOutline(0f,0f+ metrics.getAscent()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy