2012-07-03 17 views
16

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

+0

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950968 - Yeni Windows –

+0

@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

+2

Windows yerine OS yerine geçme önerisi muhtemelen yararlı değil :-) – Robin

cevap

4

Bunun bir hata ama Win7 ve temalar built_in temel özellik olmadığını düşünüyorum siz de simgeleri ölçek gerekir, G/set

1.Windows7 Temel tema geçerseniz Yazı Tipi ilginç boyutu, hala küçük Yazı Tipleri (OS instalation varsayılan ayar) örneğin

kullanmak

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 Klasik tema

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 modifiye tema

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 Klasik tema

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] 
+0

Test için teşekkürler :-) Klasik olmayan tüm temalar için varsayılan yerel font SegoeUI, IMO'dur (http://www.microsoft.com/en-us/download/details.aspx adresindeki UXGuide, pdf sürümüne bakın). id = 2695) Segoe'ye zorlanan Swing metnine karşı yerel uygulamalardaki metni karşılaştırdığımda gerçekte bu gösteriliyor. – kleopatra

İlgili konular