web-dev-qa-db-ja.com

Java Windows / LinuxでSwingアプリを使用する場合のDPIの設定方法は?

DPIが150を超えるモニター(Macbook Proなど)を使用している場合は、次の問題も見つかる可能性があります。Java = Swingアプリは高DPIモニターには小さすぎます、フォントサイズをまったく変更できません(Windows DPIを直接無視し、非常に元のDPI-> 96)。画面の解像度を変更する以外に方法はありません。

はい、高DPIモニター、15.6インチ、解像度1920x1080のラップトップがあります。一部のJava Matlab、Burpsuiteなどのラップトップではデスクトップアプリが非常に小さく見えます。インターネットは非常に長い間使用されていますが、問題の解決方法を見つけることができません。JRE_HOME/lib/font/fontconfig.properties.src、ただし、JavaデスクトップフォントのデフォルトのフォントサイズまたはDPIを設定する場所が見つかりません。

問題に解決策はありませんか?高DPIモニターをお持ちですか?そのようなアプリをどのように使いますか? Swingは高DPIユーザーを放棄しますか?

66
Searene

現在、Windowsでこの問題を調査しています。私が見つけたものは次のとおりです。

ほとんどのSwingルックアンドフィールは、高DPIをまったくサポートしていません。Nimbusでさえ、スケーラブルであるはずです。 Nimbusが最終的に高DPIスケーリングを提供するかもしれないと言っている古いブログ記事をいくつか見つけましたが、どうやらそれは決して起こらなかったようです。

1つの例外はシステムLAFですが、そのデフォルトフォントは、すべてのDPI設定で、実際のシステムフォントサイズよりも10%小さいです。さらに、ここで説明されているように、システムを明示的に選択する必要があります。 http://docs.Oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Swingで設定できる単一のスケーリング係数もありません。特定のLAFは、スケーリングを処理するコードを提供する必要があります。したがって、できることはシステムを選択し、それで十分であることを望みます。

ただし、JavaFXはシステム上で最大150%まで正しく自動的にスケーリングします。可能な限り、JavaFXを使用してGUIを構築することをお勧めします。

編集:いくつかの小さなテストプログラムを作成し、さまざまなGUIフレームワーク、Swingテーマ、およびDPI設定の比較スクリーンショットを撮りました。これは、この質問を読んでいる人にとって有益かもしれません: http://kynosarges.org/GuiDpiScaling.html

37
user574171

短い答え:JRE 9で実行する必要があります。

長い答え:
これは、Javaランタイムが「DPI対応」であると宣言したが、AWTおよびSwingで実際にサポートしていないためです。 Javaアプリケーションは、適切にスケーリングされるのではなく、ピクセルに基づいてサイズ設定およびレンダリングされました。これには、HiDPIディスプレイが含まれていました。とにかく、これは最近解決されました。問題 JEP 263:WindowsおよびLinuxでのHiDPIグラフィックス および upgrade

そのため、フォントサイズを増やしても機能しません(残りの部分は増えないため)。 jvm引数-Dsun.Java2d.dpiaware=falseは機能しません(実際にはサポートされていないため)。マニフェストファイル+レジストリ編集(Windowsの場合)は機能しません。

解決策:この機能を実際にサポートしているため、JRE 9で実行する必要があります。

7
Sergio Muriel

Linuxでは、私の実験によると、Swingのルックアンドフィールでスケーリングを実行することはできないようです。ただし、VNCを伴うハック vncdesk を使用して実行することは可能です。 vncdeskでgradle --guiを実行するための構成は次のとおりです。

.vncdesk/1/settings.ini

[desktop]
width = 1050
height = 650

[window]
title = gradle
name = gradle in vncdesk
class = GradleInVncdesk
scale_factor = 2

.vncdesk/1/startup

#!/bin/sh
cd "$INVOCATION_DIR"
matchbox-window-manager&
exec gradle --gui "$@"
4
Robin Green

次の指示に従って解決できました: Link

ドイツ語ですが、重要なものは翻訳します。

このレジストリキーを作成します。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
"PreferExternalManifest"=dword:00000001

このコンテンツでマニフェストファイルを作成します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Assembly xmlns="urn:schemas-Microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-Microsoft-com:asm.v3">

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="AMD64" publicKeyToken="1fc8b3b9a1e18e3b">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<trustInfo xmlns="urn:schemas-Microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">
    <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

</Assembly>

Java.exeとjavaw.exeが含まれるbinディレクトリにコピーし、Java.exe.manifestおよびjavaw.exe.manifest(内容は同じでも名前が異なる2つのファイルがあります)。

HTH。

ベルント

2
eferrari