2011-08-25 14 views
8

Uso Netbeans 7.0 con JDK6 en Windows 7 para diseñar la interfaz de usuario de mi aplicación Java. Aplico la apariencia y sensación del Sistema. Pero se ve de la manera que quiero en Windows, pero difiere en MacOS y, lo que es peor, se ve diferente en diferentes administradores de ventanas en Linux (LXDE, GNOME, KDE, XFCE).¿Qué fuente en Swing tiene el mismo aspecto en todos los sistemas operativos?

Me refiero a las fuentes y su tamaño. En Windows, si una etiqueta parece "v 1.23", se ve como "v ..." en otros sistemas operativos porque las fuentes se hacen más grandes en ese sistema operativo y JLabel no tiene suficiente lugar para mostrar. Esto sucede en varios lugares.

No quiero aumentar el ancho de la etiqueta. Quiero que la etiqueta se vea igual en ese ancho dado en todos los sistemas operativos. Por defecto, Netbeans usa la fuente Tahoma 11pt en mi pc. Creo que no está disponible en todos los sistemas operativos, por lo que los demás sistemas operativos utilizan una fuente diferente.

¿Es Arial una fuente común?

¿Debo cambiar la fuente de cada elemento a Arial manualmente? O alguna otra opción?

+2

La respuesta corta es que no puede y no debería tener que hacerlo. Diseña tu UI de manera que no se rompa cuando la fuente (de todas las cosas, ¿a continuación, necesitarás que la ventana permanezca en la esquina superior izquierda?) O el texto cambie ligeramente. Piensa en i18n o simplemente un diseñador que tenga una buena idea. – delnan

+0

Consulte [Fuentes físicas y lógicas] (http://download.oracle.com/javase/6/docs/api/java/awt/Font.html) y [Cómo usar los administradores de diseño] (http://download.oracle. com/javase/tutorial/uiswing/layout/using.html). – trashgod

Respuesta

5

Cuando se trata de administradores de ventanas hay mucho más que solo el tamaño de fuente, por ejemplo, el ancho entre 2 controles se maneja de manera diferente en gnome & KDE. cuando se trata de usar el mismo tamaño de fuente en todas las plataformas, puede usar la fuente Sans Serif, esta está disponible en todos los sistemas operativos con los que he trabajado.

también sería mejor (si no puede encontrar serif en un sistema operativo donde desea ejecutar su aplicación) puede descargar una fuente (gratuitas de GNU Free Fonts).

cuando se trata de establecer el tipo de letra tamaños & las fuentes, ¿por qué no tratar de usar un tema & establecer la fuente allí ... puede utilizar el método UIManager.setLookAndFeel() a cambiar los temas. aquí hay un enlace en Look & Feel

+1

Serif no es una fuente. Es una categoría de fuente. Cuando le dices a Java que use Serif, elige una fuente serif específica en tu computadora. Definitivamente habrá variedad de sistema operativo a sistema operativo. –

+0

Me había perdido eso, ahora he actualizado mi respuesta gracias @Steve –

+0

@Anantha Sharma Gracias por su respuesta. Planeo usar Nimbus Theme. – Vigneshwaran

0

Lucida Sans Regular siempre se incluye con Java, pero no creo que resuelva el problema de que algunos texto/etiquetas se salgan de formato. Eso también depende de la efectividad de la pantalla de los usuarios.

8

En su lugar, utilice un layout manager y un logical font family. Este example con el Font a continuación agrega texto de seric de cursiva de 24 puntos al centro de un (predeterminado) BorderLayout para lograr un resultado agradable en plataformas dispares.

ta.setFont(new Font("Serif", Font.ITALIC, 24)); 

Mac OS X:

Mac

Windows 7:

Windows

Ubuntu Linux:

Linux

+1

Lamentablemente, me acabo de dar cuenta de que la noción de Ubuntu de "Serif" parece inquietante "SansSerif". :-) – trashgod

+1

Si le preocupa que la cadena "Serif" cambie, 'Font.SERIF' también es una opción. – Starwarswii

0

Una vieja pregunta, pero la encontré porque estaba buscando una solución. Y mi solución es: use las fuentes DejaVu. La fuente de diálogo de Java tiene un aspecto diferente en Linux y Windows, pero DejaVuSans 12 es muy similar a la fuente de diálogo en Linux y tiene el mismo aspecto en Windows (al menos en Windows 8.1). Mi código:

... 
static Font dejaVuSans; 
static final String resPath = "<classpath>/resources/"; // no leading "/" 
... 
public static void main(String[] args) { 
    /* See: 
    * https://stackoverflow.com/questions/7434845/setting-the-default-font-of-swing-program 
    * https://stackoverflow.com/questions/8361947/how-to-get-getclass-getresource-from-a-static-context 
    */ 
    dejaVuSans = null; 
    Font f; 
    try { 
     InputStream istream = <ClassName>.class.getClassLoader().getResourceAsStream(
      resPath + "DejaVuSans.ttf"); 
     dejaVuSans = Font.createFont(Font.TRUETYPE_FONT, istream); 
     f = dejaVuSans.deriveFont(Font.PLAIN, 12); 
    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     f = null; 
    } 
    if (f == null) 
     f = new Font("Dialog", Font.PLAIN, 12); 
    java.util.Enumeration keys = UIManager.getDefaults().keys(); 
    while (keys.hasMoreElements()) { 
     Object key = keys.nextElement(); 
     Object value = UIManager.get (key); 
     if (value != null && value instanceof javax.swing.plaf.FontUIResource) 
      UIManager.put (key, f); 
    } 
    ... 
} 

Por supuesto, si DejaVuSans.ttf no se incrusta en el archivo JAR se puede importar en tiempo de ejecución. Ver How do you import a font?.

Cuestiones relacionadas