Java/2D Graphics GUI/Font
Содержание
- 1 A cache of the dynamically loaded fonts found in the fonts directory
- 2 Create font from true type font
- 3 Display font in a grid
- 4 Draw font inside a Rectangle
- 5 Finds and displays available fonts
- 6 Font centered
- 7 FontDemo lists the system fonts and provides a sample of each one(Have some problems)
- 8 Font Derivation
- 9 Font List
- 10 Font paint
- 11 Load font from ttf file
- 12 Obtain FontMetrics of different fonts
- 13 Outline Font paint
- 14 Wrap string according to FontMetrics
A cache of the dynamically loaded fonts found in the fonts directory
<source lang="java"> /*
* @(#)DemoFonts.java 1.17 06/08/29 * * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
/*
* @(#)DemoFonts.java 1.17 06/08/29 */
import java.awt.Font; import java.io.InputStream; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /**
* A cache of the dynamically loaded fonts found in the fonts directory. */
public class DemoFonts {
// Prepare a static "cache" mapping font names to Font objects. private static String[] names = { "A.ttf" }; private static Map<String, Font> cache = new ConcurrentHashMap<String, Font>(names.length); static { for (String name : names) { cache.put(name, getFont(name)); } } public static Font getFont(String name) { Font font = null; if (cache != null) { if ((font = cache.get(name)) != null) { return font; } } String fName = "/fonts/" + name; try { InputStream is = DemoFonts.class.getResourceAsStream(fName); font = Font.createFont(Font.TRUETYPE_FONT, is); } catch (Exception ex) { ex.printStackTrace(); System.err.println(fName + " not loaded. Using serif font."); font = new Font("serif", Font.PLAIN, 24); } return font; }
}
</source>
Create font from true type font
<source lang="java"> import java.awt.Font; import java.io.File; import java.io.FileInputStream; import javax.swing.JFrame; import javax.swing.JLabel; public class Main {
public static void main(String[] args) throws Exception { File f = new File("your.ttf"); FileInputStream in = new FileInputStream(f); Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, in); Font dynamicFont32Pt = dynamicFont.deriveFont(32f); JLabel testLabel = new JLabel(dynamicFont.getName()); testLabel.setFont(dynamicFont32Pt); JFrame frame = new JFrame("Font Loading Demo"); frame.getContentPane().add(testLabel); frame.pack(); frame.setVisible(true); }
}
</source>
Display font in a grid
<source lang="java"> import java.awt.Font; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class Main {
public static void main(String[] args) { final int columnCount = 10; final int side = 25; final int[][] grid = new int[50][columnCount]; JPanel panel = new JPanel() { public void paintComponent(Graphics g) { Font font = new Font("WingDings", Font.PLAIN, 14); g.setFont(font); int off = 0; for (int i = 0; i < 256 * 256; i++) { if (font.canDisplay((char) i) == false) { continue; } off++; grid[off / columnCount][off % columnCount] = i; int x = off % columnCount * side; int y = (off / columnCount) * side + side; g.drawString(Character.toString((char)i), x, y); } } }; JFrame frame = new JFrame(); panel.setSize(300, 300); frame.getContentPane().add(panel); frame.setSize(300, 300); frame.setVisible(true); }
}
</source>
Draw font inside a Rectangle
<source lang="java"> import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class StringRectPaintPanel extends JPanel {
public void paint(Graphics g) { g.setFont(new Font("",0,100)); FontMetrics fm = getFontMetrics(new Font("",0,100)); String s = "jexp"; int x = 5; int y = 5; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int h = fm.getHeight(); int w = fm.charWidth(c); g.drawRect(x, y, w, h); g.drawString(String.valueOf(c), x, y + h); x = x + w; } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new StringRectPaintPanel()); frame.setSize(500, 300); frame.setVisible(true); }
}
</source>
Finds and displays available fonts
<source lang="java"> /*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.Toolkit; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JScrollPane; /**
* Finds and displays available fonts*
* TODO: should be a JTable with the text name in one column and the demo in a * JLabel in the other. * * @author Ian Darwin (original) */ public class FontDemo extends JComponent { /** The list of Fonts */ protected String[] fontNames; /** The fonts themselves */ protected Font[] fonts; /** How much space between each name */ static final int YINCR = 20; /** * Construct a FontDemo -- Sets title and gets array of fonts on the system */ public FontDemo() { Toolkit toolkit = Toolkit.getDefaultToolkit(); // For JDK 1.1: returns about 10 names (Serif, SansSerif, etc.) // fontNames = toolkit.getFontList(); // For JDK 1.2: a much longer list; most of the names that come // with your OS (e.g., Arial, Lucida, Lucida Bright, Lucida Sans...) fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment() .getAvailableFontFamilyNames(); fonts = new Font[fontNames.length]; } public Dimension getPreferredSize() { return new Dimension(500, fontNames.length * YINCR); } /** * Draws the font names in its font. Called by AWT when painting is needed * Does lazy evaluation of Font creation, caching the results (without this, * scrolling performance suffers even on a P3-750). */ public void paint(Graphics g) { for (int i = 0; i < fontNames.length; i += 1) { if (fonts[i] == null) { fonts[i] = new Font(fontNames[i], Font.BOLD, 14); } g.setFont(fonts[i]); int x = 20; int y = 20 + (YINCR * i); g.drawString(fontNames[i], x, y); } } /** Simple main program to start it running */ public static void main(String[] args) { JFrame f = new JFrame("Font Demo"); f.getContentPane().add(new JScrollPane(new FontDemo())); f.setSize(600, 700); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } </source>
Font centered
<source lang="java"> import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; public class HorizontallyCenteredText extends JPanel {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setFont(new Font("Serif", Font.PLAIN, 48)); paintHorizontallyCenteredText(g2, "Java Source", 200, 75); paintHorizontallyCenteredText(g2, "and", 200, 125); paintHorizontallyCenteredText(g2, "Support", 200, 175); } protected void paintHorizontallyCenteredText(Graphics2D g2, String s, float centerX, float baselineY) { FontRenderContext frc = g2.getFontRenderContext(); Rectangle2D bounds = g2.getFont().getStringBounds(s, frc); float width = (float) bounds.getWidth(); g2.drawString(s, centerX - width / 2, baselineY); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new HorizontallyCenteredText()); f.setSize(450, 350); f.show(); }
}
</source>
FontDemo lists the system fonts and provides a sample of each one(Have some problems)
<source lang="java"> /*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
//// import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.Label; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /** FontDemo lists the system fonts and provides a sample of each one */ public class FontDemoLabel extends JFrame {
String fl[]; JPanel p; public FontDemoLabel() { super("Font Demo - Label"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container cp = getContentPane(); // get font name list fl = GraphicsEnvironment.getLocalGraphicsEnvironment() .getAvailableFontFamilyNames(); // IGNORE the setLayout and North/South stuff... // we will discuss it in a few pages! cp.setLayout(new BorderLayout()); cp.add(BorderLayout.NORTH, new Label("Number of Fonts = " + fl.length, Label.CENTER)); cp.add(BorderLayout.CENTER, p = new JPanel()); p.setLayout(new GridLayout(5, 0, 5, 5)); for (int i = 0; i < fl.length; i++) { JLabel lab; // The crux of the matter: for each font name, // create a label using the name as the text, // AND set the font to be the named font! p.add(lab = new JLabel(fl[i])); lab.setFont(new Font(fl[i], Font.ITALIC | Font.BOLD, 14)); } pack(); } public static void main(String[] av) { new FontDemoLabel().setVisible(true); }
}
</source>
Font Derivation
<source lang="java"> import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextAttribute; import java.awt.geom.AffineTransform; import java.util.Hashtable; import javax.swing.JFrame; import javax.swing.JPanel; public class FontDerivation extends JPanel {
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Create a 1-point font. Font font = new Font("Serif", Font.PLAIN, 1); float x = 20, y = 20; Font font24 = font.deriveFont(24.0f); g2.setFont(font24); g2.drawString("font.deriveFont(24.0f)", x, y += 30); Font font24italic = font24.deriveFont(Font.ITALIC); g2.setFont(font24italic); g2.drawString("font24.deriveFont(Font.ITALIC)", x, y += 30); AffineTransform at = new AffineTransform(); at.shear(.2, 0); Font font24shear = font24.deriveFont(at); g2.setFont(font24shear); g2.drawString("font24.deriveFont(at)", x, y += 30); Hashtable attributes = new Hashtable(); attributes.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); Font font24bold = font24.deriveFont(attributes); g2.setFont(font24bold); g2.drawString("font24.deriveFont(attributes)", x, y += 30); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new FontDerivation()); f.setSize(350, 250); f.show(); }
}
</source>
Font List
<source lang="java"> /*
* Copyright (c) 2000 David Flanagan. All rights reserved. * This code is from the book Java Examples in a Nutshell, 2nd Edition. * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied. * You may study, use, and modify it for any non-commercial purpose. * You may distribute it non-commercially as long as you retain this notice. * For a commercial use license, or to purchase the book (recommended), * visit http://www.davidflanagan.ru/javaexamples2. */
import java.awt.Font; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; /**
* An applet that displays the standard fonts and styles available in Java 1.1 */
public class FontList extends JPanel {
// The available font families String[] families = { "Serif", // "TimesRoman" in Java 1.0 "SansSerif", // "Helvetica" in Java 1.0 "Monospaced" }; // "Courier" in Java 1.0 // The available font styles and names for each one int[] styles = { Font.PLAIN, Font.ITALIC, Font.BOLD, Font.ITALIC + Font.BOLD }; String[] stylenames = { "Plain", "Italic", "Bold", "Bold Italic" }; // Draw the applet. public void paint(Graphics g) { for (int f = 0; f < families.length; f++) { // for each family for (int s = 0; s < styles.length; s++) { // for each style Font font = new Font(families[f], styles[s], 18); // create font g.setFont(font); // set font String name = families[f] + " " + stylenames[s]; // create name g.drawString(name, 20, (f * 4 + s + 1) * 20); // display name } } } public static void main(String[] a) { JFrame f = new JFrame(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setContentPane(new FontList()); f.setSize(300,300); f.setVisible(true); }
}
</source>
Font paint
<source lang="java"> import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import javax.swing.JFrame; import javax.swing.JPanel; public class SimpleFont extends JPanel{
public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); String s = "Java Source and Support"; Font font = new Font("Serif", Font.PLAIN, 24); FontRenderContext frc = g2.getFontRenderContext(); GlyphVector gv = font.createGlyphVector(frc, s); g2.drawGlyphVector(gv, 40, 60); } public static void main(String[] args) { JFrame f = new JFrame(); f.getContentPane().add(new SimpleFont()); f.setSize(350, 250); f.show(); }
}
</source>
Load font from ttf file
<source lang="java"> /*
* @(#)DemoFonts.java 1.17 06/08/29 * * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
/*
* @(#)DemoFonts.java 1.17 06/08/29 */
import java.awt.Font; import java.io.InputStream; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /**
* A cache of the dynamically loaded fonts found in the fonts directory. */
public class DemoFonts {
// Prepare a static "cache" mapping font names to Font objects. private static String[] names = { "A.ttf" }; private static Map<String, Font> cache = new ConcurrentHashMap<String, Font>(names.length); static { for (String name : names) { cache.put(name, getFont(name)); } } public static Font getFont(String name) { Font font = null; if (cache != null) { if ((font = cache.get(name)) != null) { return font; } } String fName = "/fonts/" + name; try { InputStream is = DemoFonts.class.getResourceAsStream(fName); font = Font.createFont(Font.TRUETYPE_FONT, is); } catch (Exception ex) { ex.printStackTrace(); System.err.println(fName + " not loaded. Using serif font."); font = new Font("serif", Font.PLAIN, 24); } return font; }
}
</source>
Obtain FontMetrics of different fonts
<source lang="java"> import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Main extends JFrame {
public Main() { super("Demonstrating FontMetrics"); setSize(510, 210); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint(Graphics g) { g.setFont(new Font("SansSerif", Font.BOLD, 12)); FontMetrics fm = g.getFontMetrics(); g.drawString("Current font: " + g.getFont(), 10, 40); g.drawString("Ascent: " + fm.getAscent(), 10, 55); g.drawString("Descent: " + fm.getDescent(), 10, 70); g.drawString("Height: " + fm.getHeight(), 10, 85); g.drawString("Leading: " + fm.getLeading(), 10, 100); Font font = new Font("Serif", Font.ITALIC, 14); fm = g.getFontMetrics(font); g.setFont(font); g.drawString("Current font: " + font, 10, 130); g.drawString("Ascent: " + fm.getAscent(), 10, 145); g.drawString("Descent: " + fm.getDescent(), 10, 160); g.drawString("Height: " + fm.getHeight(), 10, 175); g.drawString("Leading: " + fm.getLeading(), 10, 190); } public static void main(String args[]) { Main app = new Main(); }
}
</source>
Outline Font paint
<source lang="java"> import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.net.URL; import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JPanel; public class FontPaint extends JApplet {
public void init() { FontPanel fontPanel = new FontPanel(); getContentPane().add(fontPanel, BorderLayout.CENTER); } public static void main(String[] args) { FontPanel starPanel = new FontPanel(); JFrame f = new JFrame("Font"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.getContentPane().add(starPanel, BorderLayout.CENTER); f.setSize(new Dimension(550, 200)); f.setVisible(true); }
} class FontPanel extends JPanel {
public void paintComponent(Graphics g) { super.paintComponent(g); setBackground(Color.white); int width = getSize().width; int height = getSize().height; Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); FontRenderContext frc = g2.getFontRenderContext(); Font f = new Font("Helvetica", 1, 60); String s = new String("Java Source and Support."); TextLayout textTl = new TextLayout(s, f, frc); AffineTransform transform = new AffineTransform(); Shape outline = textTl.getOutline(null); Rectangle outlineBounds = outline.getBounds(); transform = g2.getTransform(); transform.translate(width / 2 - (outlineBounds.width / 2), height / 2 + (outlineBounds.height / 2)); g2.transform(transform); g2.setColor(Color.blue); g2.draw(outline); g2.setClip(outline); }
}
</source>
Wrap string according to FontMetrics
<source lang="java"> import java.awt.FontMetrics; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; /**
* Globally available utility classes, mostly for string manipulation. * * @author Jim Menard, */
public class StringUtils {
/** * Returns an array of strings, one for each line in the string after it has * been wrapped to fit lines of maxWidth. Lines end with any of * cr, lf, or cr lf. A line ending at the end of the string will not output a * further, empty string. * <p> * This code assumes str is notnull
. * * @param str * the string to split * @param fm * needed for string width calculations * @param maxWidth * the max line width, in points * @return a non-empty list of strings */ public static List wrap(String str, FontMetrics fm, int maxWidth) { List lines = splitIntoLines(str); if (lines.size() == 0) return lines; ArrayList strings = new ArrayList(); for (Iterator iter = lines.iterator(); iter.hasNext();) wrapLineInto((String) iter.next(), strings, fm, maxWidth); return strings; } /** * Given a line of text and font metrics information, wrap the line and add * the new line(s) to list. * * @param line * a line of text * @param list * an output list of strings * @param fm * font metrics * @param maxWidth * maximum width of the line(s) */ public static void wrapLineInto(String line, List list, FontMetrics fm, int maxWidth) { int len = line.length(); int width; while (len > 0 && (width = fm.stringWidth(line)) > maxWidth) { // Guess where to split the line. Look for the next space before // or after the guess. int guess = len * maxWidth / width; String before = line.substring(0, guess).trim(); width = fm.stringWidth(before); int pos; if (width > maxWidth) // Too long pos = findBreakBefore(line, guess); else { // Too short or possibly just right pos = findBreakAfter(line, guess); if (pos != -1) { // Make sure this doesn"t make us too long before = line.substring(0, pos).trim(); if (fm.stringWidth(before) > maxWidth) pos = findBreakBefore(line, guess); } } if (pos == -1) pos = guess; // Split in the middle of the word list.add(line.substring(0, pos).trim()); line = line.substring(pos).trim(); len = line.length(); } if (len > 0) list.add(line); } /** * Returns the index of the first whitespace character or "-" in line * that is at or before start. Returns -1 if no such character is * found. * * @param line * a string * @param start * where to star looking */ public static int findBreakBefore(String line, int start) { for (int i = start; i >= 0; --i) { char c = line.charAt(i); if (Character.isWhitespace(c) || c == "-") return i; } return -1; } /** * Returns the index of the first whitespace character or "-" in line * that is at or after start. Returns -1 if no such character is * found. * * @param line * a string * @param start * where to star looking */ public static int findBreakAfter(String line, int start) { int len = line.length(); for (int i = start; i < len; ++i) { char c = line.charAt(i); if (Character.isWhitespace(c) || c == "-") return i; } return -1; } /** * Returns an array of strings, one for each line in the string. Lines end * with any of cr, lf, or cr lf. A line ending at the end of the string will * not output a further, empty string. * <p> * This code assumes str is notnull
. * * @param str * the string to split * @return a non-empty list of strings */ public static List splitIntoLines(String str) { ArrayList strings = new ArrayList(); int len = str.length(); if (len == 0) { strings.add(""); return strings; } int lineStart = 0; for (int i = 0; i < len; ++i) { char c = str.charAt(i); if (c == "\r") { int newlineLength = 1; if ((i + 1) < len && str.charAt(i + 1) == "\n") newlineLength = 2; strings.add(str.substring(lineStart, i)); lineStart = i + newlineLength; if (newlineLength == 2) // skip \n next time through loop ++i; } else if (c == "\n") { strings.add(str.substring(lineStart, i)); lineStart = i + 1; } } if (lineStart < len) strings.add(str.substring(lineStart)); return strings; }
}