2011-09-01 45 views
10

Tôi vừa mới bắt đầu chuyển ứng dụng Swing từ OS X sang Windows và mọi thứ đang gây đau đớn với JLabel s.Văn bản html JLabel bỏ qua setFont

Tôi nhận thấy rằng phông chữ được chỉ định cho setFont bị bỏ qua nếu văn bản của nhãn là HTML (điều này không xảy ra trên máy Mac). Định dạng HTML là cực kỳ hữu ích cho khả năng đọc trên màn hình phức tạp.

Trong các trường hợp bình thường, tôi chỉ định phông chữ trong thẻ HTML, nhưng phông chữ tôi đang sử dụng được tải vào thời gian chạy bằng cách sử dụng Font.createFont với ttf ra khỏi JAR. Tôi đã thử sử dụng tên của phông chữ được tải trong thẻ phông chữ, nhưng điều đó không hoạt động.

Có cách nào tôi có thể sử dụng số được tải awt.Font với một ified html JLabel trên Windows không?

Đây là một ví dụ. Tôi không thể chia sẻ font chữ ứng dụng của tôi, nhưng tôi chỉ cần chạy nó với một này (TTF tinh khiết) và hành vi tương tự sẽ xảy ra:

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();} 
         } 
       }); 
     } 

} 

EDIT: thú vị đủ, nếu tôi sử dụng một trong ttf từ thư mục lib/fonts của JRE (trong trường hợp này một trong các phông chữ Lucida được đổi tên thành test_java.ttf) đoạn mã này tạo ra các kết quả giống hệt nhau với boolean và tắt.

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();} 
     } 
    }); 
} 

EDIT 2: Các phương pháp mô tả vào đây để thiết lập mặc định JLabel font chữ có chính xác cùng một vấn đề (bản rõ lãm mỹ, văn bản html'd không): Changing default JLabel font

EDIT 3: Tôi đã nhận thấy rằng ngay cả các phông chữ ngẫu nhiên từ dafont sẽ hoạt động nếu chúng được cài đặt trên hệ thống (ngay cả với mã chính xác này, nơi tôi được tải một bản sao của ttf [đã được cài đặt bây giờ] từ một tệp).

+0

Bạn có thể bao gồm [sscce] (http://www.sscce.org) không? Trong thời gian chờ đợi, nếu bạn chưa có, hãy đọc hướng dẫn [Cách sử dụng HTML trong Swing Components] (http://download.oracle.com/javase/tutorial/uiswing/components/html.html). – mre

+0

Rất có khả năng bạn 'Font.createFont' đang gặp sự cố.'SetFont()' của Jlabel' được đảm bảo đặt phông chữ - như @mre gợi ý, ví dụ sẽ giúp trả lời câu hỏi này tốt hơn. –

+0

Tôi biết rằng Font.createFont hoạt động vì nếu tôi setText ("example") trên JLabel, phông chữ được tải sẽ hiển thị, nhưng nếu tôi setText (" example") thì phông chữ Swing JLabel mặc định được sử dụng. Điều này có được tính là sscce không? –

Trả lời

12

registerFont()

Tôi tìm thấy viên đá quý nhỏ này trong khi Googling về nếu tôi có thể sao chép một .ttf vào JRE khi chạy. Nó thực hiện chính xác những gì nó được cho là. Nếu bạn sử dụng Font.createFont để tải một phông chữ trong thời gian chạy, chỉ cần làm:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

đăng ký với JRE.

Điều này cho phép phông chữ hiển thị trong văn bản HTML cũng như bản rõ trên Windows!

+0

+1 ['createFont () '] (http://download.oracle.com/javase/6/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29) đề cập đến điều này, nhưng đó là một chút mơ hồ. – trashgod

+0

Nó chỉ đề cập đến nó trong Java 6 javadoc. Chết tiệt bạn Google cho thấy javadoc 1.4 đầu tiên! –

+0

Không thể đổ lỗi cho Google vì Snoracle Shuffle! :-) – trashgod

4

Để tham khảo, đây là những gì được nhìn thấy trên Mac OS X.

enter image description here

Để so sánh, đây là màn hình hiển thị trên Ubuntu 10, 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

vâng, OS X hoạt động như tôi mong đợi. –

+0

Tôi đã hy vọng một sự so sánh song song dễ dàng có thể làm sáng tỏ. Tệp _any_ '.ttf' có hoạt động trên Windows không? – trashgod

+0

vâng, bản dựng sẵn (đã được JRE cài đặt) Lucida ttf làm điều đúng cho tôi. Có vẻ như Linux đang phá vỡ cho bạn, quá (là nó Sun Java hoặc OpenJDK?). –

Các vấn đề liên quan