|
|
Строка 13: |
Строка 13: |
| * [[Java/2D Graphics GUI/Curve | Curve]] | | * [[Java/2D Graphics GUI/Curve | Curve]] |
| * [[Java/2D Graphics GUI/FilteredImageSource | FilteredImageSource]] | | * [[Java/2D Graphics GUI/FilteredImageSource | FilteredImageSource]] |
| + | * [[Java/2D Graphics GUI/Font | Font]] |
| * [[Java/2D Graphics GUI/Full Screen | Full Screen]] | | * [[Java/2D Graphics GUI/Full Screen | Full Screen]] |
| * [[Java/2D Graphics GUI/GIF | GIF]] | | * [[Java/2D Graphics GUI/GIF | GIF]] |
Строка 50: |
Строка 51: |
| * [[Java/2D Graphics GUI/Transparent | Transparent]] | | * [[Java/2D Graphics GUI/Transparent | Transparent]] |
| * [[Java/2D Graphics GUI/XOR | XOR]] | | * [[Java/2D Graphics GUI/XOR | XOR]] |
− |
| |
− | == 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
| |
− | * <p>
| |
− | * 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 <var>maxWidth</var>. 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 <var>str</var> is not <code>null</code>.
| |
− | *
| |
− | * @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 <var>list</var>.
| |
− | *
| |
− | * @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 <var>line</var>
| |
− | * that is at or before <var>start</var>. 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 <var>line</var>
| |
− | * that is at or after <var>start</var>. 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 <var>str</var> is not <code>null</code>.
| |
− | *
| |
− | * @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;
| |
− | }
| |
− | }
| |
− |
| |
− |
| |
− |
| |
− | </source>
| |