2012-07-03 14 views
16

simplemente (asombrosamente ;-) notó la razón por la que las aplicaciones se ven tan apretadas en mis máquinas win6 + (las mismas para Vista y Win7, ambas con 120dpi, jdk6 y jdk7): la fuente de control alzó la vista de la propiedad de escritorio tiene tanto la familia de fuentes mal y el tamaño incorrecto:Error o característica: Swing fuente gui predeterminada incorrecta para Win6 +

public static void main(String[] args) { 
    Font guiFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty("win.defaultGUI.font"); 
    int guiSize = guiFont.getSize(); 
    Font iconFont = (Font) Toolkit.getDefaultToolkit().getDesktopProperty("win.icon.font"); 
    System.out.println("gui default: " + guiFont + "\nicon default: " + iconFont); 
} 

de salida:

gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=13] 
icon default: java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=15] 

el último se utiliza en aplicaciones nativas para casi todo el texto, mientras que oscilación utiliza el anterior ...

Preguntas:

  • ¿Podría haber una razón para esto, o simplemente un error?
  • Quién es responsable: la búsqueda de Swing (cuando se lee -en la propiedad de escritorio de los recursos relevantes del sistema) o el sistema operativo que no informa correctamente?
  • ¿Cómo forzar el uso de este último?

opciones para resolver la última:

  • con un control total sobre la LAF podría considerar para establecer todas las fuentes de texto relevantes (que es lo que hace JGoodies, cuenta en un FontPolicy/Set).
  • Un hack sucio es establecer el valor de la propiedad de escritorio deGUI por defecto en el valor correcto; implica el acceso reflexivo al kit de herramientas, que naturalmente explotará en contextos de seguridad limitada.
  • ??

Editar

Por si acaso alguien está interesado, aquí está el truco sucio:

/** 
* Replaces the default gui desktop font property with the icon font 
* if the former is smaller. 
* 
*/ 
public static void ensureDefaultGUIFontSize() { 
    Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    Font guiFont = (Font) toolkit.getDesktopProperty("win.defaultGUI.font"); 
    Font iconFont = (Font) toolkit.getDesktopProperty("win.icon.font"); 
    if (guiFont.getSize() < iconFont.getSize()) { 
     invokeDeclaredMethod("setDesktopProperty", Toolkit.class, 
      toolkit, "win.defaultGUI.font", iconFont); 
    } 
} 

private static void invokeDeclaredMethod(String methodName, 
     Class<?> clazz, Object instance, String propertyName, 
     Object propertyValue) { 
    try { 
     Method method = clazz.getDeclaredMethod(methodName, String.class, Object.class); 
     method.setAccessible(true); 
     method.invoke(instance, propertyName, propertyValue); 
    } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 
     LOG.finer("forcing desktop property failed " + e.getStackTrace()); 
    } 

} 

Editar 2

Solo para aclarar: el truco es plenamente eficaz para WindowsLAF. Nimbus ignora por completo la configuración del sistema, Metal en parte: la fuente de este último siempre es Diálogo, solo el tamaño se toma de las propiedades de escritorio. Suena medio bueno, pero no lo es: el mapeo es bastante extraño para las fuentes principales, f.i. el tamaño controlFont muy utilizado se ajusta a "win.ansiVar.font.height" (lo que sobra fósiles es que?) que es 13 en mi máquina ...

Datos 3

Incluso en las ventanas de la interfaz de usuario , el truco es ... un truco con limitaciones, fi los mencionados en el comentario de @ Walter:

Este error se nota especialmente al escalar la interfaz de usuario de Windows. FYI, al abrir un JFileChooser se revierte el truco.También altura JTree fila/JTable no se actualizará automáticamente al nuevo tamaño de fuente y tendrás que escalar sus iconos, así

+0

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950968 - Supongo que la solución no funciona con el nuevo Windows –

+0

@WalterLaan hmm ... no debería reemplazarse esa vieja solución por años, incluso antes del error MS Sans vs. Tahoma: http: //bugs.sun. com/bugdatabase/view_bug.do? bug_id = 5079742. El más reciente que pude encontrar es http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6436509 que está cerrado como no reproducible (es cierto, ya que el 0/null se ha ido pero ahora no devuelve el correcto valor ...) – kleopatra

+2

Sugerencia para cambiar a OS X en lugar de Windows probablemente no sea útil :-) – Robin

Respuesta

4

Creo que no es un error, sino propiedad básica de Win7 y built_in temas, tamaño interesante de Font, que todavía utilizan fuentes más pequeñas (ajuste predeterminado del sistema operativo instalación)

por ejemplo, si fijo/Switch

1.Windows7 tema básico

gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 
icon default: java.awt.Font[family=Segoe UI,name=Segoe UI,style=plain,size=12] 

2.Windows7 Classic tema

gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 
icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 

don't touched the Font property, will be continue for from WinXP 

3.WindowXP modificado tema Tema

gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 
icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=13] 

4.Windows7 clásico

gui default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 
icon default: java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11] 
+0

gracias por probar :-) Para todos los temas no clásicos, la fuente nativa predeterminada es SegoeUI, IMO (consulte la versión de UXGuide, pdf en http://www.microsoft.com/en-us/download/details.aspx? id = 2695) Que de hecho se muestra cuando comparo el texto en aplicaciones nativas contra el texto de Swing forzado a Segoe. – kleopatra

Cuestiones relacionadas