2009-05-28 21 views

cevap

3

Birkaç karakterin çizilmiş uzunluklarını karşılaştırın (m, i, 1,. Iyi bir ayar olmalı).

Tek boşluklu fontlar için hepsi eşit olmayacak, değişken genişlikte yazı tipleri için olmazlar.

+0

Eğer örnek kod ekleyebilir miyim bir BufferedImage yapma gerektirmeyen basit bir yöntem? Pratik ve basit bir yaklaşım için – Jonik

+0

+1; Ben kullanıyorum ve m. –

1

this response'a göre, Java, temel yazı tipi ayrıntıları hakkında fazla bilgi sahibi olmaz, bu nedenle yazı tipi boyutlarının bazı karşılaştırmaları yapmanız gerekir.

4

FontMetrics sınıfının getWidths() yöntemini kullanabilirsiniz. JavaDoc'u göre:

Yazı Tipi ilk 256 karakter avans genişlikleri alır. Avans, en soldaki noktadan, karakterin taban çizgisindeki en sağdaki noktaya olan mesafedir. Bir String'in ilerlemesinin mutlaka karakterlerinin ilerlemelerinin toplamı olmadığını unutmayın.

Sen FontMetrics sınıfının charWidth(char) yöntemi kullanabilirsiniz. sadece, bir tek aralıklı yazı tipini ayarlama mantıksal yazı tipi adını kullanmak istiyorsanız Muhtemelen

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

Örnek kodunuzu genişletdiğiniz için teşekkürler - belirli bir Yazı Tipi için FontMetrics'in nasıl alınacağı açık değildi. Yine de, bu sebeple makinemde (OS X) herhangi bir monospaced font bulamıyor ... – Jonik

+0

Monospaced olduğu bilinen bir fontla test ettim (java.awt.Font [aile = Andale Mono, name = Andale Mono , stil = düz, boyut = 12]). Bu yazı tipi için getWidths() aşağıdaki gibi sayıları döndürür: 7 0 4 4 4 4 4 4 0 7 7 4 7 7 4 ...: -/ – Jonik

+0

Güncel kodları deneyin –

1

dava için geçerli değil: Örneğin:

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

Bu tek boşluklu garantili olacak sisteminizde yazı tipi.

4

.: Bir Grafik vb nesne almak için

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); 
     } 
    } 
İlgili konular