2012-10-06 42 views
3

當我嘗試使用Wingdings字體(或其他符號字體)時,文本以矩形而不是正確的文本出現。我如何獲得正確的人物展示?如何在Java Swing中使用Wingdings字體

import java.awt.*; 
import javax.swing.*; 

public class WingdingsFontDisplay extends JFrame 
{ 
    public static void main(String[] args) 
    { 
     new WingdingsFontDisplay(); 
    } 

    public WingdingsFontDisplay() 
    { 
     this.setSize(500,150); 
     this.setTitle("Fun with Fonts"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //This shows that I do have "Wingdings" available 
     GraphicsEnvironment g; 
     g = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     String[] fonts = g.getAvailableFontFamilyNames(); 
     for(String f : fonts) 
     { 
      System.out.println(f); 
     } 

     //Displaying text in the Wingdings font shows rectangles 
     JLabel wingdingsText = new JLabel("All work and no play makes Jack a dull boy"); 
     Font f1 = new Font("Wingdings", Font.PLAIN, 14); 
     wingdingsText.setFont(f1); 
     this.add(wingdingsText, BorderLayout.NORTH); 

     //Displaying text in Arial works correctly 
     JLabel arialText = new JLabel("All work and no play makes Jack a dull boy"); 
     Font f2 = new Font("Arial", Font.PLAIN, 14); 
     arialText.setFont(f2); 
     this.add(arialText, BorderLayout.SOUTH); 

     this.setVisible(true); 
    } 
} 

回答

4

您需要爲您尋找的符號使用適當的Unicode範圍。在Java中,符號不會覆蓋在ASCII範圍內,但有自己獨特的字符代碼。

您可以在http://unicode.org/~asmus/web-wing-ding-ext.pdf找到相應的符號代碼的引用。最常見的符號位於0x2200和0x2700 Unicode範圍內。

您的Java安裝可能包含SymbolTest示例小程序,​​該示例小程序使用戶可以直接預覽帶有可用字體的Unicode範圍的表示。但是,要警告的是,更好的Java實現將使用不是指定字體的符號或字符的字體替換,所以您需要確保實際上獲得了指定的字體。

+0

謝謝。我下載了SymbolTest applet,並通過它完成了我的工作。我意識到我可以通過向字符代碼添加0x1000來顯示Wingding字符。 – Roy

+0

但我不明白爲什麼我必須這樣做。例如,如果我想打印出字符65,那麼我想要程序打印字符65.大多數字體將顯示它看起來類似於'A'。 Wingdings應該將它展示爲一個用2個手指舉起的手。 – Roy

+0

@Roy,Unicode的設計使得每個字符值都具有語義含義。無論字體如何,「A」總是意味着「A」,而「雙手高舉的手」通常意味着「雙手高舉的手」,而不管字體如何。這意味着即使原始字體不可用,Unicode文本仍具有語義含義,這對於國際文本來說是很常見的。瀏覽unicode.org獲取更多信息。 –