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í
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950968 - Supongo que la solución no funciona con el nuevo Windows –
@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
Sugerencia para cambiar a OS X en lugar de Windows probablemente no sea útil :-) – Robin