2012-02-17 12 views
8

Tengo un JTextPane y tengo un texto dentro de ese JTextPane. Sin embargo, debido a que he estado usando HTML dentro del Panel, el texto parece haberse cambiado automáticamente a Times New Roman.Java - Cambiar fuente en un JTextPane que contiene HTML

Estoy tratando de establecer el tipo de letra dentro de JTextPane a la fuente predeterminada de la GUI (la fuente de JTextPane cuando no es HTML). Sin embargo, no puedo simplemente configurar la fuente en una fuente porque difiere del sistema operativo, por lo tanto, quiero encontrar una manera de obtener la fuente predeterminada y luego cambiar el texto que tengo a la fuente predeterminada.

Para demostrar cómo se cambia el texto a Times New Roman cuando se convierte, el siguiente código es el formato que he utilizado. ¿Cómo podría cambiarlo para lograr mi objetivo?

import javax.swing.JFrame; 
import javax.swing.JTextPane; 


public class GUIExample { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("My App"); 
     frame.setSize(300,300); 
     JTextPane pane = new JTextPane(); 
     pane.setContentType("text/html"); 
     pane.setText("<html><b>This is some text!</b></html>"); 
     frame.add(pane); 

     frame.setVisible(true); 

    } 

} 

¡Gracias!

manera

Respuesta

7

más sencilla es probablemente algo como esto:

string fontfamily = pane.getFont().getFamily(); 

que le dará la fuente predeterminada. A continuación, sólo aplicarlo usando CSS:

pane.setText("<html><body style=\"font-family: " + fontfamily + "\"<b>This is some text!</b></html>"); 
+0

Esto me ayudó a salir con él, he implementado un nuevo método en otra clase para devolver el tipo de letra predeterminado para un componente y luego usar que dentro de HTML similar a su propio. Gracias. – mino

1

El procesador de HTML JComponent utiliza su propia fuente, y no el de la JComponent. Para que el componente muestre lo mismo, debe establecer los atributos de fuente en la cadena html. Entre otras cosas, tendrá que ajustar la familia de fuentes, tamaño, negrita/cursiva, etc.

A modo de ejemplo, se puede hacer lo siguiente:

JTextPane pane = new JTextPane(); 
Font font = pane.getFont(); 
pane.setContentType("text/html"); 
pane.setText("<html><font face=\"" + font.getFamily() + "\" size=\"" + font.getSize() + "\"></font>This is some text!</html>"); 

Sería bastante trivial para crear una función que hace esto por ti. Pase un JComponent y una cadena, y creará el texto html para usted, incluidas todas las etiquetas de fuentes.

+0

Intenté su método, pero no pareció funcionar para mí, exactamente cómo lo mostró. – mino

+1

es una de esas etiquetas pedantes que técnicamente debe volver a especificarse dentro de muchas otras etiquetas; no se puede simplemente envolver por fuera. Entonces esta solución es demasiado frágil para el contenido general. –

22

A continuación se hará el truco:

pane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); 

(Tenga en cuenta que JTextPane extiende JEditorPane.)

actualización (agosto de 2016):

Para el ajuste de sobrevivir Mira & Feel y cambios en el sistema (p. ej., fuentes cambiadas en el Panel de control de Windows) la línea se puede colocar aquí:

@Override 
    public void updateUI() { 
     super.updateUI(); 
     putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); 
    } 

(Esto también se llama durante la construcción.)

+0

increíble, gracias! – Mark

Cuestiones relacionadas