Ошибка или функция: Swing default gui font неверен для Win6 +

просто (удивительно;-) заметил, почему приложения выглядят настолько тесноватыми на моих машинах win6 + (то же самое для Vista и Win7, оба с настройкой 120dpi, jdk6 и jdk7): шрифт управления, просмотренный из свойства рабочего стола, имеет как неправильное семейство шрифтов и неправильный размер:

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

выход:

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] 

Последний используется в собственных приложениях почти для всего текста, а Swing использует предыдущий...

Вопросы:

  • Может ли быть какая-то причина для этого или просто ошибка?
  • Кто отвечает: поиск Swing (при чтении в DesktopProperty из соответствующих системных ресурсов) или ОС, не сообщая об этом правильно?
  • Как принудительно использовать последнее?

Параметры для решения последнего:

  • С полным контролем LAF можно рассмотреть возможность установки всех соответствующих текстовых шрифтов (что делает JGoodies, внесенных в FontPolicy/Set).
  • Грязный взломать - установить значение свойства desktopGUI для рабочего стола на правильное значение - оно включает рефлексивный доступ к набору инструментальных средств, который, естественно, будет вдуваться в контексте, ограниченном безопасностью.
  • ??

Edit

На всякий случай кого-то интересует, вот грязный хак:

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

}

Изменить 2

Просто пояснить: взлом полностью эффективен только для WindowsLAF. Nimbus полностью игнорирует системные настройки, частично отчасти: последний шрифт всегда является диалоговым, только размер берется из desktopProperties. Звучит на полпути хорошо, но нет: отображение довольно странно для основных шрифтов, f.i. сильно используемый размер элемента управленияFont установлен на "win.ansiVar.font.height" (что такое остаточное ископаемое?), которое равно 13 на моей машине...

Изменить 3

Даже в windows ui, взломать... взломать с ограничениями, f.i. те, о которых говорится в комментарии @Walter:

Эта ошибка особенно заметна при масштабировании пользовательского интерфейса Windows. FYI, открытие JFileChooser возвращает хак. Также высота строки JTree/JTable не будет автоматически обновляться до нового размера шрифта, и вам также нужно будет масштабировать свои значки.

Ответ 1

Я думаю, что это не ошибка, а базовое свойство Win7 и встроенных тем, интересный размер шрифта, я по-прежнему использую более мелкие шрифты (настройка по умолчанию от установки ОС)

например, если я устанавливаю/переключаю

1.Windows7 Основная тема

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 Классическая тема

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 измененная тема

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 Классическая тема

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]