Błąd lub funkcja: Nieprawidłowe ustawienie domyślnej czcionki gui dla Win6 +

po prostu (zadziwiająco ;-) zauważył powód, dla którego aplikacje wyglądają tak ciasno na moich komputerach win6 + (tak samo dla Vista i Win7, zarówno z ustawieniem 120dpi, jdk6 i jdk7): czcionka kontrolna wyszukana z właściwości pulpitu ma zarówno niewłaściwą czcionkę rodzina i niewłaściwy rozmiar:

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);
}

wydajność:

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] 

Ten ostatni jest używany w aplikacjach natywnych dla prawie całego tekstu, podczas gdy Swing używa pierwszego ...

Pytania:

Czy może to być jakiś powód, czy tylko błąd?Kto jest odpowiedzialny: wyszukiwanie Swing (podczas odczytywania własności pulpitu z odpowiednich zasobów systemowych) lub system operacyjny nie zgłaszający go poprawnie?Jak wymusić użycie tego drugiego?

Opcje rozwiązywania ostatniego:

Z pełną kontrolą nad LAF można rozważyć ustawienie wszystkich odpowiednich czcionek tekstowych (tak właśnie robi JGoodies, uwzględnionych w FontPolicy / Set).Brudny hack polega na ustawieniu wartości właściwości pulpitu defaultGUI na poprawną wartość - wiąże się to z refleksyjnym dostępem do zestawu narzędzi, który w naturalny sposób będzie działał w ograniczonych kontekstach bezpieczeństwa.??

Edytować

Na wypadek, gdyby ktoś był zainteresowany, oto brudny hack:

/**
 * 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());
    }

}

Edytuj 2

Aby wyjaśnić: hack jest w pełni skuteczny tylko dla WindowsLAF. Nimbus całkowicie ignoruje ustawienia systemu, częściowo Metal: czcionka tego ostatniego jest zawsze Dialog, tylko rozmiar jest pobierany z właściwości DesktopProperties. Brzmi w połowie dobrze, ale nie: mapowanie jest raczej dziwne dla głównych czcionek, f.i. mocno używany rozmiar controlFont jest ustawiony na „win.ansiVar.font.height” (co to jest resztka skamieniałości?), która wynosi 13 na moim komputerze ...

Edytuj 3

Nawet w Windowsie hack to ... hack z ograniczeniami, f.i. osoby wymienione w komentarzu @ Waltera:

Ten błąd jest szczególnie widoczny podczas skalowania interfejsu użytkownika systemu Windows. FYI, otwarcie JFileChooser przywraca hack. Również wysokość wiersza JTree / JTable nie zostanie automatycznie zaktualizowana do nowego rozmiaru czcionki, a także będziesz musiał skalować swoje ikony