2011-09-01 8 views
10

Acabo de comenzar a portar mi aplicación Swing de OS X a Windows y las cosas son dolorosas con JLabel s.El texto html de JLabel ignora setFont

He notado que la fuente especificada en setFont se ignora si el texto de la etiqueta es HTML (esto no ocurre en la Mac). El formato HTML es EXTREMADAMENTE útil para la legibilidad en pantallas complicadas.

En circunstancias normales, especifico la fuente en una etiqueta HTML, pero la fuente que uso se carga en tiempo de ejecución usando Font.createFont con un ttf fuera del JAR. Intenté usar el nombre de la fuente cargada en la etiqueta de la fuente, pero eso no funcionó.

¿Hay alguna manera de que pueda usar un awt.Font cargado con un html-ified JLabel en Windows?

Aquí hay un ejemplo. No puedo compartir la fuente de mi solicitud, pero sólo se acabó con éste (una TTF puro), y el mismo comportamiento que ocurre:

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: curiosamente, si uso una de los ttf de la carpeta lib/fonts de JRE (en este caso una de las fuentes Lucida aquí renombradas como test_java.ttf) este fragmento produce resultados idénticos con el booleano activado y desactivado.

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: El método descrito aquí para establecer la fuente predeterminada JLabel tiene exactamente el mismo problema (texto sin muestra fina, texto html'd no lo hace): Changing default JLabel font

Datos 3: he notamos que incluso las fuentes aleatorias de dafont funcionarán si están instaladas en el sistema (incluso con este código exacto, donde estoy cargado una copia del ttf [ahora instalado] de un archivo).

+0

¿Sería posible para usted incluir un [sscce] (http://www.sscce.org)? Mientras tanto, si aún no lo has hecho, lee el tutorial [Cómo usar HTML en componentes Swing] (http://download.oracle.com/javase/tutorial/uiswing/components/html.html). – mre

+0

Es muy probable que 'Font.createFont' tenga problemas.'' SetFont() 'de' Jlabel' se garantiza para establecer la fuente - como @mre sugiere, el ejemplo ayudaría a responder mejor esto. –

+0

Sé que Font.createFont funciona porque si configuroTexto ("ejemplo") en JLabel aparece la fuente cargada, pero si configuroTexto (" ejemplo") se usa la fuente Swing JLabel predeterminada. ¿Esto cuenta como una sscce? –

Respuesta

12

registerFont()

Encontré esta pequeña joya mientras buscaba en Google si podía copiar un .ttf en el JRE en tiempo de ejecución. Hace exactamente lo que se supone que debe hacer. Si utiliza Font.createFont cargar una fuente en tiempo de ejecución, acaba de hacer:

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(myCreatedFont)

para registrarlo en el JRE.

Esto permite que la fuente se muestre en texto HTML y en texto plano en Windows.

+0

+1 ['createFont () '] (http://download.oracle.com/javase/6/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29) menciona esto, pero es un poco vago. – trashgod

+0

Solo lo menciona en Java 6 javadoc. ¡Maldita seas Google por mostrar el javadoc de 1.4 primero! –

+0

¡No se puede culpar a Google por el Snoracle Shuffle! :-) – trashgod

4

Para referencia, aquí es lo que se ve en Mac OS X.

enter image description here

En comparación, aquí está la pantalla en 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

Sí, OS X funciona como esperaba para mí. –

+0

Tenía la esperanza de que una comparación fácil de lado a lado pudiera arrojar luz. ¿Funciona _any_ '.ttf' el archivo en Windows? – trashgod

+0

sí, el incorporado (ya instalado por JRE) Lucida ttf hace lo correcto para mí. Parece que Linux se está rompiendo para ti también (¿es Sun Java o OpenJDK?). –

Cuestiones relacionadas