2009-05-28 10 views
10

मैं उपयोगकर्ता की मशीन पर उपलब्ध सभी मोनोस्पेस्ड फ़ॉन्ट्स की सूची बनाने की कोशिश कर रहा हूं। मैं स्विंग में सभी फ़ॉन्ट परिवारों को प्राप्त कर सकता हूं:परीक्षण करना कि जावा में एक फ़ॉन्ट मोनोस्पेस्ड है

String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment() 
            .getAvailableFontFamilyNames(); 

क्या यह पता लगाने का कोई तरीका है कि इनमें से कौन सा मोनोस्पेस्ड है?

अग्रिम धन्यवाद।

उत्तर

3

कई वर्णों की खींची गई लंबाई की तुलना करें (एम, i, 1, एक अच्छा सेट होना चाहिए)।

मोनोस्पेस्ड फोंट के लिए वे सभी बराबर होंगे, परिवर्तनीय चौड़ाई फ़ॉन्ट्स के लिए वे नहीं होंगे।

+0

आप उदाहरण कोड जोड़ सकते हैं एक BufferedImage बनाने की आवश्यकता नहीं है कि? व्यावहारिक और सरल दृष्टिकोण के लिए – Jonik

+0

+1; मैं आई और एम का उपयोग करता हूं। –

1

this response के अनुसार, जावा अंतर्निहित फ़ॉन्ट विवरणों के बारे में बहुत कुछ नहीं जानता है, इसलिए आपको फ़ॉन्ट के आयामों की कुछ तुलना करना होगा।

4

आप FontMetrics कक्षा के getWidths() विधि का उपयोग कर सकते हैं। जावाडॉक के अनुसार:

फ़ॉन्ट में पहले 256 वर्णों की अग्रिम चौड़ाई प्राप्त करता है। अग्रिम बाईं ओर बिंदु से चरित्र की आधार रेखा पर दाएं बिंदु तक दूरी है। ध्यान दें कि एक स्ट्रिंग का अग्रिम जरूरी नहीं है कि वह अपने पात्रों की प्रगति का योग हो।

आप FontMetrics वर्ग के charWidth(char) विधि का उपयोग कर सकते हैं। उदाहरण के लिए:

Set<String> monospaceFontFamilyNames = new HashSet<String>(); 

GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
String[] fontFamilyNames = graphicsEnvironment.getAvailableFontFamilyNames(); 

BufferedImage bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
Graphics graphics = bufferedImage.createGraphics(); 

for (String fontFamilyName : fontFamilyNames) { 
    boolean isMonospaced = true; 

    int fontStyle = Font.PLAIN; 
    int fontSize = 12; 
    Font font = new Font(fontFamilyName, fontStyle, fontSize); 
    FontMetrics fontMetrics = graphics.getFontMetrics(font); 

    int firstCharacterWidth = 0; 
    boolean hasFirstCharacterWidth = false; 
    for (int codePoint = 0; codePoint < 128; codePoint++) { 
     if (Character.isValidCodePoint(codePoint) && (Character.isLetter(codePoint) || Character.isDigit(codePoint))) { 
      char character = (char) codePoint; 
      int characterWidth = fontMetrics.charWidth(character); 
      if (hasFirstCharacterWidth) { 
       if (characterWidth != firstCharacterWidth) { 
        isMonospaced = false; 
        break; 
       } 
      } else { 
       firstCharacterWidth = characterWidth; 
       hasFirstCharacterWidth = true; 
      } 
     } 
    } 

    if (isMonospaced) { 
     monospaceFontFamilyNames.add(fontFamilyName); 
    } 
} 

graphics.dispose(); 
+0

अपना उदाहरण कोड विस्तारित करने के लिए धन्यवाद - यह स्पष्ट नहीं था कि किसी दिए गए फ़ॉन्ट के लिए FontMetrics कैसे प्राप्त करें। फिर भी, किसी कारण से मुझे मेरी मशीन (ओएस एक्स) पर कोई मोनोस्पेस्ड फोंट नहीं मिला है ... – Jonik

+0

मैंने एक फ़ॉन्ट के साथ परीक्षण किया जो मोनोस्पेस्ड (java.awt.Font [family = Andale Mono, name = Andale Mono) के रूप में जाना जाता है , शैली = सादा, आकार = 12])। इस फ़ॉन्ट के लिए GetWidths() जैसे नंबर लौटाता है: 7 0 4 4 4 4 4 0 7 7 4 7 7 4 ...: - – Jonik

+0

अद्यतन कोड –

1

शायद अपने मामले के लिए लागू नहीं है, लेकिन आप बस, एक monospaced फ़ॉन्ट के लिए फ़ॉन्ट सेट तार्किक फ़ॉन्ट नाम उपयोग करना चाहते हैं:

Font mono = new Font("Monospaced", Font.PLAIN, 12); 

यह एक प्रयुक्त होते गारंटी हो जाएगा आपके सिस्टम पर फ़ॉन्ट।

4

एक सरल विधि एक ग्राफिक्स वस्तु आदि प्राप्त करने के लिए .:

Font fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); 
    List<Font> monoFonts1 = new ArrayList<>(); 

    FontRenderContext frc = new FontRenderContext(null, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT); 
    for (Font font : fonts) { 
     Rectangle2D iBounds = font.getStringBounds("i", frc); 
     Rectangle2D mBounds = font.getStringBounds("m", frc); 
     if (iBounds.getWidth() == mBounds.getWidth()) { 
      monoFonts1.add(font); 
     } 
    } 
संबंधित मुद्दे