swingutilities2.java

来自「java jdk 1.4的源码」· Java 代码 · 共 132 行

JAVA
132
字号
/* * @(#)SwingUtilities2.java	1.2 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing;import java.awt.*;import java.awt.font.*;import java.awt.geom.*;/** * A collection of utility methods for Swing. * <p> * <b>WARNING:</b> While this class is public, it should not be treated as * public API and its API may change in incompatable ways between dot dot * releases and even patch releases. You should not rely on this class even * existing. * * @version 1.2 01/23/03 */public class SwingUtilities2 {    // Maintain a cache of CACHE_SIZE fonts and the left side bearing    // of the characters falling into the range MIN_CHAR_INDEX to    // MAX_CHAR_INDEX. The values in lsbCache are created as needed.    private static final FontRenderContext DEFAULT_FRC = new FontRenderContext(                             null, false, false);    private static final byte UNSET = Byte.MAX_VALUE;    // getLeftSideBearing will consult all characters that fall in the    // range MIN_CHAR_INDEX to MAX_CHAR_INDEX.    private static final int MIN_CHAR_INDEX = (int)'W';    private static final int MAX_CHAR_INDEX = (int)'W' + 1;    // Windows defines 6 font desktop properties, we will therefore only    // cache the metrics for 6 fonts.    private static final int CACHE_SIZE = 6;    // nextIndex in lsbCache and fontCache to insert a font into.    private static int nextIndex;    // Cache of left side bearnings.    private static byte[][] lsbCache;    // Caches of fonts    private static Font[] fontCache;    private static final char[] oneChar = new char[1];    static {        fontCache = new Font[CACHE_SIZE];        lsbCache = new byte[CACHE_SIZE][];        for (int counter = 0; counter < CACHE_SIZE; counter++) {            lsbCache[counter] = new byte[MAX_CHAR_INDEX - MIN_CHAR_INDEX];            reset(lsbCache[counter]);        }    }    /**     * Marks the values in the byte array as needing to be recalculated.     */    private static void reset(byte[] data) {        for (int counter = data.length - 1; counter >= 0; counter--) {            data[counter] = UNSET;        }    }    /**     * Returns the left side bearing of the first character of string. The     * left side bearing is calculated from the passed in font assuming     * a FontRenderContext with the identity transform.     * If the passed in String is less than one character, this     * will throw a StringIndexOutOfBoundsException exception.     */    public static int getLeftSideBearing(Font f, String string) {        char firstChar = string.charAt(0);        return getLeftSideBearing(f, string.charAt(0));    }    /**     * Returns the left side bearing of the first character of string. The     * left side bearing is calculated from the passed in font assuming     * a FontRenderContext with the identity transform.     * If the passed in String is less than one character, this     * will throw a StringIndexOutOfBoundsException exception.     */    public static int getLeftSideBearing(Font f, char firstChar) {        int charIndex = (int)firstChar;        if (charIndex < MAX_CHAR_INDEX && charIndex >= MIN_CHAR_INDEX) {            byte[] lsbs = null;            charIndex -= MIN_CHAR_INDEX;            synchronized(SwingUtilities2.class) {                for (int counter = CACHE_SIZE - 1; counter >= 0;                     counter--) {                    if (fontCache[counter] == null) {                        fontCache[counter] = f;                        lsbs = lsbCache[counter];                        break;                    }                    else if (fontCache[counter].equals(f)) {                        lsbs = lsbCache[counter];                        break;                    }                }                if (lsbs == null) {                    // no more room                    lsbs = lsbCache[nextIndex];                    reset(lsbs);                    fontCache[nextIndex] = f;                    nextIndex = (nextIndex + 1) % CACHE_SIZE;                }                if (lsbs[charIndex] == UNSET) {                    lsbs[charIndex] = (byte)_getLeftSideBearing(                                                 f, firstChar);                }                return lsbs[charIndex];            }        }        return 0;    }    /**     * Computes and returns the left side bearing of the specified     * character.     */    private static int _getLeftSideBearing(Font f, char aChar) {        oneChar[0] = aChar;        GlyphVector gv = f.createGlyphVector(DEFAULT_FRC, oneChar);        Rectangle bounds = gv.getGlyphPixelBounds(0, DEFAULT_FRC, 0f, 0f);        return bounds.x;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?