2011-09-01 14 views
10

Sadece Swing uygulamamı OS X'den Windows'a taşımaya başladım ve işler JLabel s ile ağrılı.JLabel html metni yok sayar setFont

Etiketin metni HTML ise (bu Mac'te olmazsa), setFont için belirtilen yazı tipinin yok sayıldığını fark ettim. HTML formatı karmaşık görüntüler üzerinde okunabilirlik için son derece yararlıdır.

Normal koşullar altında yazı tipini bir HTML etiketinde belirtirim, ancak kullandığım yazı tipi, çalışma zamanında JAR'dan bir ttf ile Font.createFont kullanarak yüklenir. Yazı tipi etiketinde yüklü yazı tipi adını kullanmayı denedim, ancak çalışmadı.

Yüklü awt.Font, Windows'ta bir html-ified JLabel yüklü olarak kullanabileceğim herhangi bir yolu var mı?

İşte bir örnek. Benim uygulamanın yazı paylaşamaz, ama sadece bu bir (saf TTF) ve aynı davranışı ile ran olur:

http://www.dafont.com/sophomore-yearbook.font

import java.awt.Font; 
import java.io.File; 
import javax.swing.*; 

public class LabelTestFrame extends JFrame { 

     public LabelTestFrame() throws Exception { 
       boolean useHtml = true; 
       String fontPath = "C:\\test\\test_font.ttf"; 
       JLabel testLabel = new JLabel(); 
       Font testFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
       testLabel.setFont(testFont); 
       if (useHtml) testLabel.setText("<html>Some HTML'd text</html>"); 
       else testLabel.setText("Some plaintext"); 
       getContentPane().add(testLabel); 
       setSize(300,300); 
     } 

     public static void main(String[] args) { 
       SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
           try {new LabelTestFrame().setVisible(true);} 
           catch (Exception e) {e.printStackTrace();} 
         } 
       }); 
     } 

} 

DÜZENLEME: ilginçtir ki, ben birini kullanıyorsanız ttf'nin JRE'nin lib/fontlar klasöründen (burada buradaki Lucida yazı tiplerinden biri test_java.ttf olarak yeniden adlandırılır), bu snippet, boolean açıkken ve kapalıyken aynı sonuçları üretir.

public LabelTestFrame() throws Exception { 
    boolean useHtml = false; 
    String fontPath = "C:\\test\\test_java.ttf"; 
    JLabel testLabel = new JLabel(); 
    Font testFont = Font.createFont(Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
    testLabel.setFont(testFont); 
    if (useHtml) testLabel.setText("<html><b>Some HTML'd text</b></html>"); 
    else testLabel.setText("Some plaintext"); 
    getContentPane().add(testLabel); 
    setSize(300,300); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try {new LabelTestFrame().setVisible(true);} 
      catch (Exception e) {e.printStackTrace();} 
     } 
    }); 
} 

DÜZENLEME 2: JLabel yazı varsayılan ayarı için buraya açıklanan yöntem tam olarak aynı sorun var (düz metin ince gösterir, html'd metin değil): Changing default JLabel font

DÜZENLEME 3: Ben ettik dafont gelen rasgele yazı tiplerinin bile sisteme yüklendikleri (hatta bir dosyadan [şimdi yüklü] ttf'nin bir kopyasını yüklediğim bu tam kodla bile) çalışacaklarını fark ettiler.

+0

Bir [sscce] ekleyebilmeniz mümkün mü (http://www.sscce.org)? Bu arada, henüz yapmadıysanız, [Swing Bileşenlerinde HTML Nasıl Kullanılır] (http://download.oracle.com/javase/tutorial/uiswing/components/html.html) eğitimini okuyun. – mre

+0

Font.createFont'un sorun yaşamanız büyük olasılıktır.'Jlabel' 'setFont() 'yazı tipini ayarlamasının garantilidir - Mre'nin önerdiği gibi, bu örnek daha iyi cevap vermemize yardımcı olacaktır. –

+0

Font.createFont'un çalıştığını biliyorum çünkü eğer JLabel'de setText ("ornek") yüklüyse yazı tipi görünür, ancak eğer setText (" örnek") varsayılan Swing JLabel font kullanılır. Bu bir sscce olarak sayılır mı? –

cevap

12

görülüyor ne registerFont()

Çalışma zamanında JRE'ye bir kopyalayıp kopyalayamama konusunda Googling yaparken bu küçük gem'i buldum. Tam olarak ne gerekiyorsa yapar. çalışma zamanında bir font yüklemek için Font.createFont kullanırsanız, sadece yapın:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

JRE ile kayıt.

Bu, yazı tipinin Windows'da düz metinlerin yanı sıra HTML'd metninde görünmesini sağlar!

+0

+1 ['createFont () '(http://download.oracle.com/javase/6/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29) bundan bahseder, ama biraz belirsiz. – trashgod

+0

Sadece Java 6 javadoc'ta bahseder. İlk önce 1.4'in javadoc'unu göstermek için Google'a lanet olsun! –

+0

Snoracle Shuffle için Google'ı suçlayamam! :-) – trashgod

4

Başvuru için, burada,

Karşılaştırıldığında

enter image description here

, burada Ubuntu 10 ekran var Mac OS X'te OpenJDK 6.

enter image description here

import java.awt.Font; 
import java.awt.GridLayout; 
import java.io.File; 
import javax.swing.*; 

public class LabelTestFrame extends JFrame { 

    public LabelTestFrame() throws Exception { 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLayout(new GridLayout(0, 1)); 
     String fontPath = "SophomoreYearbook.ttf"; 
     Font testFont = Font.createFont(
      Font.TRUETYPE_FONT, new File(fontPath)).deriveFont(18f); 
     JLabel label1 = new JLabel("<html>Some HTML'd text</html>"); 
     label1.setFont(testFont); 
     this.add(label1); 
     JLabel label2 = new JLabel("Some plaintext"); 
     this.add(label2); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        new LabelTestFrame().setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
+0

Evet, OS X benim için beklendiği gibi çalışıyor. –

+0

Kolay bir yan yana karşılaştırmanın ışık tutacağını umuyordum. _any_ '.ttf' dosyası Windows üzerinde çalışıyor mu? – trashgod

+0

Evet, yerleşik (zaten JRE yüklü) Lucida ttf benim için doğru olanı yapar. Linux sizin için de kırılıyor gibi görünüyor (Sun Java mı OpenJDK mı?). –