2014-01-21 59 views
0

我正在使用字體作爲數據。這些字體採用AWT格式。我想在我的eclipse應用程序的TableView中有一個字體樣本。不幸的是,SWT有它自己的Font類。它與AWT有什麼關係?是否有可能將一種字體轉換爲另一種字體?如何將AWT字體轉換爲SWT字體? SWT不完整:無法使用文件中的字體名稱

我AWT的字體是由TTF文件的代碼

in = getClass().getResourceAsStream(fileNames[i]); 
font = Font.createFont(Font.TRUETYPE_FONT, in).deriveFont(FontSize); 

該字體是完全的的文件是非常重要的獲得。

UPDATE

難以置信!看起來像SWT作者想象自己很酷,創建自己的和分開的Font實現,所以唯一的對應關係是由文件。但他們的手顫抖着,他們忘記實施字體名稱確定!

更新2

我已經準備了TTF文件,這實際上是Times New Roman字體,但在所有的名稱被改變爲Arial。我將這個文件命名爲arial_actuallytimes.ttf

的我跑到下面的程序

public static void main(String[] args) throws FontFormatException, IOException 
    { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(1, false)); 

     // The font file 
     File fontFile = new File("arial_actuallytimes.ttf"); 
     // Get the font name from AWT 
     Font awtFont = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(12f); 
     String fontName = awtFont.getFontName(); 
     shell.setText(fontName); 

     // Load the font in SWT 
     display.loadFont(fontFile.getAbsolutePath()); 

     // Get the font instance with the name we got from AWT 
     final org.eclipse.swt.graphics.Font swtFont = new org.eclipse.swt.graphics.Font(display, fontName, 12, SWT.NORMAL); 

     // Use the font 
     Label label = new Label(shell, SWT.BORDER); 
     label.setFont(swtFont); 
     label.setText("The quick brown fox jumps over the lazy dog"); 
     label.addListener(SWT.Dispose, new Listener() 
     { 
      @Override 
      public void handleEvent(Event arg0) 
      { 
       swtFont.dispose(); 
      } 
     }); 

     Composite frameHolder = new Composite(shell, SWT.EMBEDDED); 
     frameHolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); 
     //frameHolder.setLayout(new FillLayout()); 

     JLabel jLabel = new JLabel("The quick brown fox jumps over the lazy dog"); 
     jLabel.setFont(awtFont); 

     JPanel jPanel = new JPanel(new BorderLayout()); 
     jPanel.add(jLabel, BorderLayout.CENTER); 

     Frame frame = SWT_AWT.new_Frame(frameHolder); 
     frame.setLayout(new BorderLayout()); 
     frame.add(jPanel); 
     frame.pack(); 

     shell.pack(); 
     shell.open(); 

     while (!shell.isDisposed()) 
     { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 

的結果如下

enter image description here

這意味着SWT沒有承認字體爲宋體。可能是分心Arial這是系統默認情況下,它採用默認Arial

更新3

文件樣本:https://drive.google.com/file/d/0B1jZw9H7L4gmTjUwYURhU0lkeGM/edit?usp=sharing

回答

1

您可以使用

Device.loadFont(file path); 

加載的字體 - 這需要一個文件路徑,而不是資源流。

你會再使用

new Font(device, "font name", height, style); 

創建SWT字體。

+2

注意OP:請記住'用這種方法創建'處理()'字體'。 – Baz

+0

但第一行和第二行之間的連接在哪裏?如果設備只能載入一種字體,那麼「字體名稱」參數是什麼?或者如果這個參數起作用,那麼如何保證那個字體會被使用? –

+0

設備可以加載許多字體。使用加載的字體數據的一部分的字體名稱使字體可用。您必須在Font構造函數中指定該字體名稱。 –

1

根據@ greg-449的回答,我想出了這個。所有缺少的是一種獲取字體名稱的方法:

public static void main(String[] args) throws FontFormatException, IOException 
{ 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new FillLayout()); 

    // The font file 
    File fontFile = new File("DIN.ttf"); 
    // Get the font name from AWT 
    String fontName = Font.createFont(Font.TRUETYPE_FONT, fontFile).deriveFont(12).getFontName(); 

    // Load the font in SWT 
    display.loadFont(fontFile.getAbsolutePath()); 

    // Get the font instance with the name we got from AWT 
    final org.eclipse.swt.graphics.Font swtFont = new org.eclipse.swt.graphics.Font(display, fontName, 12, SWT.NORMAL); 

    // Use the font 
    Text text = new Text(shell, SWT.BORDER); 
    text.setFont(swtFont); 
    text.addListener(SWT.Dispose, new Listener() 
    { 
     @Override 
     public void handleEvent(Event arg0) 
     { 
      swtFont.dispose(); 
     } 
    }); 

    shell.pack(); 
    shell.open(); 

    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 
+0

如何確定,'AWT'返回的字體名稱與'SWT'相同並且適用於'SWT'?特別是如果他們完全分開?爲什麼'SWT'創作者忘記創建自己的實現來跟蹤字體名稱?假設我根本沒有任何'AWT'代碼。我怎麼能從這個案例的文件中使用字體,只能通過'SWT'來表示? –

+0

@SuzanCioc我不知道爲什麼在SWT中這麼做,但爲什麼你不想在這種護理中使用AWT?它是每個Java運行時的一部分,似乎工作得很好。 – Baz

+0

看到我的更新,看起來好像沒有。可能是我犯了一個錯誤,但看起來像'SWT'通過'AWT'名稱錯誤地識別了字體。 –