web-dev-qa-db-ja.com

高DPIディスプレイ上で拡大されたJavaアプリケーションを実行するにはどうすればよいですか?

私は、Windows 10上で高DPIディスプレイ上でJavaアプリ(JARファイル)を実行しようとしています。このアプリはSwingを使用しているため、DPIに対応していません。通常、DPIに対応していないアプリケーションを実行すると、ぼやけていますが、Windowsがそれを拡張します。しかし、何らかの理由でそれはJavaアプリを拡張するものではありません。読むことができないテキストがある小さな窓がすぐそこにあります。 Windowsの高DPI(ぼやけた)スケーリングでJavaアプリケーションを実行する方法

70
Jeff E

ここでの問題は、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を使う

33
CarlG

私のWindows 10マシンで簡単な解決策を見つけたところです。

  1. インストールしたJava.exeを見つけます。
  2. 右クリック - > Properties
  3. Compatibilityタブに行きます
  4. チェックOverride high DPI scaling behavior.
  5. Scaling performed by:Systemを選択してください
60
Elderry

あなたがこの質問に出くわしたが、実際に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

12
Christian Hujer

解決策:JRE 9上で実行してください。

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

そのため、フォントサイズを大きくしてもうまくいきません(それ以外の部分は大きくならないため)。 jvm引数の-Dsun.Java2d.dpiaware=falseは機能しません(実際にはサポートされていないため)。マニフェストファイル+レジストリの編集(Windows用)は動作しません。

それから、JRE 9でそれを実行する必要があります。それが本当にこの機能をサポートしているからです。

10
Sergio Muriel

すべての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の拡大/縮小設定を手動で変更することはできません。

4
masterxilo

次のようにregeditでPreferExternalManifestを設定し、Java.exeとjavaw.exeのカスタムマニフェストを作成する必要があります。stackoverflow answer https://stackoverflow.com/a/39372897

2
droidlabel

ケネスありがとう。 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を実行します。

2
xile

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

0
Kenneth

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

0
Stan Towianski