için varsayılan varsayılan gui yazı tipi yanlıştır (şaşırtıcı derecede ;-), uygulamaların neden win6 + makinelerinde bu kadar dar göründüğünü fark ettiler (Vista ve Win7 için aynı, hem 120dpi ayarı, jdk6 ve jdk7 ile birlikte): kontrol yazı masaüstü özelliğinden baktım yanlış yazı tipi ailesi ve yanlış beden hem sahiptir:Hata veya özellik: 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);
}
çıkışı:
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]
ikincisi salıncak ederken, neredeyse tüm metin için yerli uygulamalarında kullanılır eski kullanır ...
Sorular:
- Bunun için herhangi bir neden, ya da sadece bir hata olabilir mi?
- Sorumlu olan kişi: Swing araması (masaüstünü okurken uygun sistem kaynaklarından) veya işletim sistemi düzgün bir şekilde rapor etmiyor mu?
- İkinci bölümün kullanımı nasıl zorlanır? Geçen çözümü için
Seçenekler:
- LAF biri hakkında tam kontrolü ile (yani JGoodies bir FontPolicy/Set hesaba, yaptığı da budur) ilgili tüm metin yazı tiplerini belirlemek için düşünebilirsiniz.
- Kirli bir hack, defaultGUI masaüstü özelliğinin değerini doğru değere ayarlamalıdır - bu, güvenlik kısıtlı bağlamlarda doğal olarak esecek olan araç setine yansıtıcı erişim gerektirir.
- ??
Düzenleme herkes ilgileniyor Her ihtimale karşı
, burada kirli beygir:
/**
* 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());
}
}
Düzenleme
2 Sadece netleştirmek için: kesmek sadece tamamen etkilidir WindowsLAF için. Nimbus, sistem ayarlarını tamamen yok sayar Metal kısmen: ikincisinin yazı tipi her zaman Dialog'dur, sadece masaüstüProperties'ten boyut alınır. Kulağa hoş geliyor, ama değil: haritalama ana yazı tipleri için oldukça garip. Yoğun olarak kullanılan controlFont boyut pencereler ui 3
Hatta benim makinede 13 olan "win.ansiVar.font.height" (bu ne fosil kalan nedir?) ...
Düzenleme ayarlandığında , hack ... sınırlamaları olan bir hack, fi @ Walter'ın yorumunda belirtilenler:
Bu hata, özellikle Windows UI'yu ölçeklediğinizde fark edilir. FYI, bir JFileChooser açarak hack'i geri alır.Ayrıca JTree/JTable satır yüksekliği otomatik olarak yeni yazı tipi boyutuna güncellenecektir olmayacak ve
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950968 - Yeni Windows –
@WalterLaan hmm ile geçici çözüm işe yaramıyor sanırım ... bu eski geçici çözüm çağlar için değiştirilmemelidir, hatta MS Sans vs Tahoma hata: http: //bugs.sun önce oldu. com/bugdatabase/view_bug.do? bug_id = 5079742. En son bulabildiğim, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6436509 tekrarlanamaz olarak kapatıldı (0/null olduğu için doğru, ancak şimdi doğru değil value ...) – kleopatra
Windows yerine OS yerine geçme önerisi muhtemelen yararlı değil :-) – Robin