ちょうど (驚くべきことに ;-) 私の 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 の行の高さは新しいフォント サイズに自動的に更新されないため、アイコンもスケーリングする必要があります。