18

ちょうど (驚くべきことに ;-) 私の 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 を読み込むとき) またはそれを正しく報告しない OS ですか?
  • 後者の使用を強制する方法は?

最後を解決するためのオプション:

  • LAF を完全に制御することで、関連するすべてのテキスト フォントを設定することを検討できます (これは JGoodies が行っていることで、FontPolicy/Set に組み込まれています)。
  • 汚いハックは、defaultGUI デスクトップ プロパティの値を正しい値に設定することです。これには、ツールキットへのリフレクティブ アクセスが含まれます。これは、セキュリティが制約されたコンテキストでは当然失敗します。
  • ??

編集

誰かが興味を持っている場合に備えて、ここに汚いハックがあります:

/**
 * 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 はシステム設定を完全に無視します。Metal は部分的に無視します。後者のフォントは常にダイアログで、サイズのみが desktopProperties から取得されます。中途半端に聞こえますが、そうではありません: 主要なフォントのマッピングはかなり奇妙です。頻繁に使用される controlFont のサイズは "win.ansiVar.font.height" (化石の残り物は何ですか?) に設定されており、これは 13 です。私のマシンで...

編集 3

Windows UI でも、ハックは ... 制限付きのハックです。@Walter のコメントで言及されているもの:

このバグは、Windows UI をスケーリングするときに特に顕著です。参考までに、JFileChooser を開くと、ハックが元に戻ります。また、JTree/JTable の行の高さは新しいフォント サイズに自動的に更新されないため、アイコンもスケーリングする必要があります。

4

1 に答える 1

5

これはバグではないと思いますが、Win7 と built_in テーマの基本的なプロパティ、フォントの興味深いサイズ、私はまだ小さいフォントを使用しています (OS インストールのデフォルト設定)

たとえば、設定/切り替えた場合

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]
于 2012-07-03T21:32:00.203 に答える