2015-11-28 39 views
5

CẬP NHẬT - sự cố hiện được giải quyết theo cách xấu xí - nhưng phải có cách thích hợp để thực hiện?Hiển thị HTML Java JLabel bị cắt xén khi phông chữ mâu thuẫn với phông chữ hệ thống

Tôi đang gặp sự cố khi hiển thị văn bản trong phông chữ tùy chỉnh, trong HTML trong JLabel khi tên phông chữ mâu thuẫn với tên của phông chữ đã được cài đặt trên hệ thống.

Phông chữ hệ thống ở định dạng khác (otf vs ttf) nên không ngạc nhiên khi văn bản bị cắt xén.

Cuộc gọi đến GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont trả về false để hiển thị phông chữ không đăng ký được. Vì vậy, tôi đoán câu hỏi là, có cách nào để sử dụng phông chữ này mà không cần đăng ký, hoặc một cách để đổi tên nó trước khi đăng ký?

Bây giờ tôi đã giải quyết được vấn đề của mình bằng cách chỉnh sửa tệp ttf và mangling tên phông chữ để thực hiện xung đột, nhưng tôi đoán phải có cách thích hợp để xử lý tình huống này.

package test; 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.GraphicsEnvironment; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.swing.JApplet; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
class MyComponent extends JPanel { 
    Font font; String text; 
    public MyComponent(Font f) {font=f;} 
    public void initSwing() 
    { 
     final String labelcontents = "<html><center>foo</center></html>"; 
     System.out.println(labelcontents); 
     JLabel text = new JLabel(labelcontents); 
     text.setFont(font); 
     add(text,BorderLayout.CENTER); 
    } 
} 

@SuppressWarnings("serial") 
public class TestApplet extends JApplet { 
     public void init() 
     { 
      Font mainFont = null; 
      InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf"); 
      try { 
       mainFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(24f); 
       System.out.println(mainFont.getName()); 
       boolean registered=GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(mainFont); 
       System.out.println("registered "+registered); 
      } catch (FontFormatException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

      final Container fframe = (JComponent)(getContentPane()); 
      final MyComponent component = new MyComponent(mainFont); 

      Thread t = new Thread(new Runnable() { 
       public void run() { try { 

        SwingUtilities.invokeAndWait(new Runnable() {public void run() { 
         fframe.add(component); 
         component.initSwing(); 
         fframe.revalidate(); 
         fframe.repaint(); 
        }}); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } } 
      }); 
      t.start(); 
     } 
} 
+0

Font Exo-Bold được sử dụng trong đoạn code trên có thể - ví dụ - được tải về từ http: //www.1001freefonts. com/d/5755/exo.zip? –

+0

Tôi không nhớ nguồn của nó ngay bây giờ nhưng nó là từ bộ sưu tập phông chữ miễn phí –

+0

Có lẽ bạn có thể chia sẻ tệp phông chữ của mình? Bạn có thấy các vấn đề tương tự đối với phông chữ mặc định không? –

Trả lời

1

Có thể văn bản chứa các lệnh HTML có bộ ký tự hoặc như vậy.

String text1 = "<html><body>" 
    + text.replace("&", "&amp;") 
      .replace("<", "&lt;") 
      .replace(">", "&gt;"); 
    + "</body></html>"; 
+0

Suy nghĩ tốt nhưng không. Html duy nhất nó chứa là '
'. (Tôi muốn nó hỗ trợ '' nhưng trường hợp trên không có nó). –

1

Rất lạ. Khi tôi chạy ví dụ applet của bạn trên máy tính xách tay của tôi, sản lượng có vẻ tốt đẹp:

Screenshot with perfectly nice spelled "foo"

Tôi đã sử dụng zip file này với tập tin "Exo-Bold.ttf" và đang sử dụng Java 8 (phiên bản 1.8.0_65 của Oracle JDK) trên Windows 8.1.

Đây là phiên bản chuyển thể của mã của bạn mà tôi chạy:

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

@SuppressWarnings("serial") 
class MyComponent extends JPanel { 
    Font font; String text; 
    public MyComponent(Font f) {font=f;} 
    public void initSwing() 
    { 
     final String labelcontents = "<html><center>foo</center></html>"; 
     System.out.println(labelcontents); 
     JLabel text = new JLabel(labelcontents); 
     text.setFont(font); 
     add(text,BorderLayout.CENTER); 
    } 
} 

@SuppressWarnings("serial") 
public class TestApplet extends JApplet { 
    public void init() 
    { 
     Font mainFont = null; 

     try { 
      //InputStream is = getClass().getResourceAsStream("fonts/Exo-Bold.ttf"); 
      InputStream is = new FileInputStream("C:/Freek/[...]/Exo-Bold.ttf"); 
      mainFont = Font.createFont(Font.TRUETYPE_FONT, is) 
          .deriveFont(Font.BOLD, 24f); 
      is.close(); 
      System.out.println(mainFont.getName()); 
      boolean result = GraphicsEnvironment.getLocalGraphicsEnvironment() 
               .registerFont(mainFont); 
      System.out.println("Result registerFont: " + result); 
     } catch (FontFormatException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     final Container fframe = (JComponent)(getContentPane()); 
     final MyComponent component = new MyComponent(mainFont); 

     Thread t = new Thread(new Runnable() { 
      public void run() { try { 

       SwingUtilities.invokeAndWait(new Runnable() {public void run() { 
        fframe.add(component); 
        component.initSwing(); 
        fframe.revalidate(); 
        fframe.repaint(); 
       }}); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } } 
     }); 
     t.start(); 
    } 
} 
+0

Cảm ơn bạn đã kiểm tra. Xem cập nhật của tôi ở trên. –

+0

Java 1.8.66 trên Windows 7 x64. Việc cài đặt cùng một phông chữ (có thể là .otf) trên hệ thống có gây ra vấn đề cho bạn không? –

+0

Nó có thể liên quan đến tệp phông chữ. Để được rõ ràng: Tôi đã không cài đặt phông chữ, nhưng tải xuống nó để applet có thể sử dụng nó. –

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