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