}
}
+ protected static String buildFontHeightProperty(String fontName) {
+ return "font." + fontName + ".height";
+ }
+ protected static String buildFontWidthsProperty(String fontName) {
+ return "font." + fontName + ".widths";
+ }
+ protected static String buildFontCharactersProperty(String fontName) {
+ return "font." + fontName + ".characters";
+ }
+
/**
* Create an instance of <code>FontDetails</code> by loading them from the
* provided property object.
*/
public static FontDetails create( String fontName, Properties fontMetricsProps )
{
- String heightStr = fontMetricsProps.getProperty( "font." + fontName + ".height");
- String widthsStr = fontMetricsProps.getProperty( "font." + fontName + ".widths");
- String charactersStr = fontMetricsProps.getProperty( "font." + fontName + ".characters");
+ String heightStr = fontMetricsProps.getProperty( buildFontHeightProperty(fontName) );
+ String widthsStr = fontMetricsProps.getProperty( buildFontWidthsProperty(fontName) );
+ String charactersStr = fontMetricsProps.getProperty( buildFontCharactersProperty(fontName) );
// Ensure that this is a font we know about
if(heightStr == null || widthsStr == null || charactersStr == null) {
*/
class StaticFontMetrics
{
+ /** The font metrics property file we're using */
private static Properties fontMetricsProps;
+ /** Our cache of font details we've already looked up */
private static Map fontDetailsMap = new HashMap();
/**
*/
public static FontDetails getFontDetails(Font font)
{
+ // If we haven't already identified out font metrics file,
+ // figure out which one to use and load it
if (fontMetricsProps == null)
{
InputStream metricsIn = null;
}
}
+ // Grab the base name of the font they've asked about
String fontName = font.getName();
- if (fontDetailsMap.get(fontName) == null)
- {
+ // Some fonts support plain/bold/italic/bolditalic variants
+ // Others have different font instances for bold etc
+ // (eg font.dialog.plain.* vs font.Californian FB Bold.*)
+ String fontStyle = "";
+ if(font.isPlain()) fontStyle += "plain";
+ if(font.isBold()) fontStyle += "bold";
+ if(font.isItalic()) fontStyle += "italic";
+
+ // Do we have a definition for this font with just the name?
+ // If not, check with the font style added
+ if(fontMetricsProps.get(FontDetails.buildFontHeightProperty(fontName)) == null &&
+ fontMetricsProps.get(FontDetails.buildFontHeightProperty(fontName+"."+fontStyle)) != null) {
+ // Need to add on the style to the font name
+ fontName += "." + fontStyle;
+ }
+
+ // Get the details on this font
+ if (fontDetailsMap.get(fontName) == null) {
FontDetails fontDetails = FontDetails.create(fontName, fontMetricsProps);
fontDetailsMap.put( fontName, fontDetails );
return fontDetails;
- }
- else
- {
+ } else {
return (FontDetails) fontDetailsMap.get(fontName);
}
graphics.setFont(font);
graphics.drawString("This is another test", 10, 10);
+ // And test with ones that need the style appending
+ font = new Font("dialog", Font.PLAIN, 12);
+ graphics.setFont(font);
+ graphics.drawString("This is another test", 10, 10);
+
+ font = new Font("dialog", Font.BOLD, 12);
+ graphics.setFont(font);
+ graphics.drawString("This is another test", 10, 10);
+
// But with an invalid font, we get an exception
font = new Font("IamAmadeUPfont", Font.PLAIN, 22);
graphics.setFont(font);