私は、Windows 10上で高DPIディスプレイ上でJavaアプリ(JARファイル)を実行しようとしています。このアプリはSwingを使用しているため、DPIに対応していません。通常、DPIに対応していないアプリケーションを実行すると、ぼやけていますが、Windowsがそれを拡張します。しかし、何らかの理由でそれはJavaアプリを拡張するものではありません。読むことができないテキストがある小さな窓がすぐそこにあります。 Windowsの高DPI(ぼやけた)スケーリングでJavaアプリケーションを実行する方法
ここでの問題は、SwingがデフォルトでDPIに対応していると主張しているため、Windowsがそれを拡大縮小できないことです。この動作をオフにするには、このスイッチを使用します。そうすると、windowsがあなたのswingアプリを拡張し始めます。
-Dsun.Java2d.dpiaware=false
[編集:残念ながら、このフラグはもはやJava 8では動作していないようで、私はJava 6でテストしていた。これは 既知の問題であるように見える 。 ]
[編集2:EXEマニフェストを修正するプログラムを使用して、Java 8インストールを正しく動作するように修正することができます。 Java.exeとjavaw.exeの内部のマニフェストで設定をtrueからfalseに変更したところ、SwingプログラムはWindows 10 high dpiで正しく拡大縮小されます。これには Resource Tuner を使用しました。]
[編集3] Java 9を使う
私のWindows 10マシンで簡単な解決策を見つけたところです。
Java.exe
を見つけます。Properties
Compatibility
タブに行きますOverride high DPI scaling behavior.
Scaling performed by:
にSystem
を選択してくださいあなたがこの質問に出くわしたが、実際にLinux上で動作する解決策を探しているなら、これはあなたのためです。
アプリケーションを起動するJava
バイナリにパラメータを追加できる場合は、オプション-D
を使用してSun.Java2d.uiScale
プロパティに値を渡し、Java2Dのスケールファクタを指定できます。これはあなたのアプリケーションを拡張します。倍率の値は倍精度です。起動したJavaアプリケーションではなく、このオプションをJava
バイナリ自体に渡してください。
例:2.5のUI倍率でNearInfinity.jarを起動します。
Java -Dsun.Java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar
私はこの記事がHiDPIシステム上でLinuxを動かすのに非常に有用であることを見つけました、そして、物事のいくつかはWindows上でも同様に働くかもしれません: https://wiki.archlinux.org/index.php/ HiDPI
解決策:JRE 9上で実行してください。
これは、Javaランタイムが自身を「DPI対応」と宣言していたが、AWTとSwingに対しては実際にはサポートしていなかったためです。 Javaアプリケーションは、適切にスケーリングされるのではなく、ピクセルに基づいてサイズおよびレンダリングされました。これにはHiDPIディスプレイが含まれます。とにかく、これは最近解決されました。問題 JEP 263:WindowsおよびLinux上のHiDPIグラフィック および アップグレード を参照してください。
そのため、フォントサイズを大きくしてもうまくいきません(それ以外の部分は大きくならないため)。 jvm引数の-Dsun.Java2d.dpiaware=false
は機能しません(実際にはサポートされていないため)。マニフェストファイル+レジストリの編集(Windows用)は動作しません。
それから、JRE 9でそれを実行する必要があります。それが本当にこの機能をサポートしているからです。
すべてのJava実行可能ファイルを強制的に "プロパティ>互換性> dpiスケーリングモード"を "システム"に設定するには、管理者権限シェル(win-x、a)で、次のコマンドを実行します。
$javaexes = (Get-ChildItem -path "$env:ProgramFiles\Java","${env:ProgramFiles(x86)}\Java" -filter java?.exe -recurse | Where-Object {$_.Name -match "Java(|w).exe"} ).fullname
$javaexes | foreach {REG ADD "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /V $_ /T REG_SZ /D "~ DPIUNAWARE" /F}
元に戻すには:
$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /V $_ /f}
HKCUの代わりにHKLMを使用することもできますが、Java * .exeファイルの[プロパティ]> [互換性]ダイアログでは、dpiの拡大/縮小設定を手動で変更することはできません。
次のようにregeditでPreferExternalManifestを設定し、Java.exeとjavaw.exeのカスタムマニフェストを作成する必要があります。stackoverflow answer https://stackoverflow.com/a/39372897
ケネスありがとう。 C:\Program Files (x86)\Java\jre\bin\Java.exe
を見つけてright click -> properties -> compatibility tab -> "override high DPI scaling behavior"
を選択し、System
を選択すると動作します。また、javaw.exe
の互換性を変更する同じ方法を試しました。
PS:その方法を使用して、win10 1703でburpsuite.jar
を実行します。
Elderryの解決策はいいのですが、Windows上でjarファイルを実行したいのに、互換性オプションがない場合はどうしますか?
C:¥Program Files(x86)¥Java¥jre¥binに移動して、javaw.exeを見つけます。右クリック、[プロパティ]、[互換性]タブをクリックし、[高DPIスケーリングの動作を無効にする]をオンにして[システム]を選択します([システム拡張]は機能しませんでした)。
Jarファイルのウィンドウは、読みやすいテキストに合わせて拡大縮小する必要があります。そうでなければ、Windowsはjarタイプのファイルをjavaw.eveにリンクしていません。サードパーティの修正プログラムは次のサイトで入手できます。 https://johann.loefflmann.net/en/software/jarfix/index.html
Java 10を試してください。
-Dsun.Java2d.dpiaware = falseがJava 9または10では機能しないことがわかりました。また、Java 8および9では、Swingアプリケーションは小さくなりますが、Java 10のサイズはWindowsで適切に決まります。
java -jar xxx.jarのようなバットファイルから実行できるアプリの場合
私はちょうどbatファイルにJava_HOME = ....\Java_10とPATH =%Java_HOME%\ bin;%PATH%を追加しました。
Java -jar xxx.jar