高DPIディスプレイでアップスケールされたJavaアプリを実行するにはどうすればよいですか?


75

Windows 10の高DPIディスプレイでJavaアプリ(JARファイル)を実行しようとしています。このアプリはSwingを使用しているため、DPI対応ではありません。通常、DPIに対応していないアプリケーションを実行すると、Windowsはぼやけていますが、それをスケーリングします。しかし、何らかの理由で、Javaアプリのスケーリングは行われません。隅に小さなテキストウィンドウがあり、読みにくいテキストが表示されます。Windowsの高DPI(ぼかし)スケーリングでJavaアプリを実行するにはどうすればよいですか?


それはあなたのアプリケーションであり、ソース/オブジェクトを制御していますか、それとも今では変更できないレガシーアプリケーションですか?
ハリーマク

3
私のアプリケーションではありません。ソースを制御できません。
ジェフE

悪いニュースですが、そのアプリケーションを実行するにはDPIを下げる必要があるかもしれません。ここでは役立つかもしれないハックといくつかのリソースです:Windowsの10でぼやけたフォントを修正しWindowsの10でのDPI設定Windowsの10 DPIぼやけました。念のため、試してみる前に少なくともシステムの復元ポイントのバックアップを作成してください。フォールバックソリューションは、Windows 7に戻ることです。
harrymc15年

5
@harrymc上記のいずれかがどのように役立ちますか?問題はぼやけたフォントではなく、実行を拒否することでもありません。問題はすべてが小さいことです。「ぼんやりした」フォントレンダリングは私が達成したいものであり、OPの質問を理解したように、それらも同様です。DPIスケーリングを100%に設定すると、システム全体が小さくなります。ディスプレイ解像度を非ネイティブに設定すると、すべてがぼやけて見えます。(さて、私にとっては1080pディスプレイよりもぼやけていませんが、それでもです。)
millimoose

1
@harrymc後者はアプリを使いやすくするかもしれませんが、「Xを2160pディスプレイで動作させるにはどうすればよいですか?」「より悪い表示を使用する」と言うのは、一種の見落としがあります。
ミリムース

回答:


37

ここでの問題は、SwingがデフォルトでDPI対応であると主張しているため、Windowsはそれをスケーリングしないことです。このスイッチを使用してこの動作をオフにすると、ウィンドウがスイングアプリのスケーリングを開始します。

-Dsun.java2d.dpiaware=false

[編集:残念ながら、このフラグはJava 8では動作しないようです。Java6でテストしていました。これは既知の問題のようです。]

[編集2:プログラムを使用してEXEマニフェストを変更することにより、Java 8インストールを正しく動作するように変更できます。java.exeおよびjavaw.exe内のマニフェストの設定をtrueからfalseに変更したところ、SwingプログラムはWindows 10の高dpiで正しくスケーリングされます。リソースチューナーを使用しました。]

[編集3] Java 9を使用するだけ


編集#2について詳しく説明してください。マニフェストで正確にどの設定を変更しましたか?
トマラック

:<windowsSettings asmv3>:マニフェストXMLでは、<アプリケーションasmv3>の下に<dpiAware>フラグである
CarlG

それがポイントです。そのフラグを見たことfalseがあり、それをに設定しましたが、アプリケーション(JNLP / WebStart)はどちらの方法でも適切にスケーリングしませんでした。これが機能するかどうかをクロスチェックする簡単な方法、たとえば、この設定に応答することがわかっているテストアプリを考えられますか?
トマラック

Webstartは、インストール済みのどのjreディストリビューションでどの実行可能ファイルを使用するかを正確に特定するのが難しいため、特に扱いにくいです。クロスチェックとして、java.exeまたはjavaw.exeを使用してアプリを直接起動し、JWSをスキップして違いがあるかどうかを確認します。
CarlG 16

4
これは、コミカルとファルシカルの間のどこかにあります。フレームワークはその機能を誤って報告し、エラーを修正したスイッチは削除されます。唯一の回避策は?エンドユーザーがサードパーティのツールを購入するため。そして、なぜJavaがそれほど評判が悪いのか疑問に思っています。
基本的な

68

私のWindows 10マシンで簡単な解決策を見つけました。

  1. java.exeインストールされていることを確認します。
  2. 右クリック-> Properties
  3. Compatibilityタブに移動
  4. 小切手 Override high DPI scaling behavior.
  5. を選択SystemするScaling performed by:

5
最善の解決策-.jnlpファイルの実行でこの問題が発生したため、「C:\ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe」を変更する必要がありましたが、これは魅力的なものでした。
ハラリ

私にとっては、JDKバージョンでした。右クリックし、Windows 10でタスクマネージャからオプションを開くことで発見
ブライアンKnoblauch

3
JavaベースのMinecraftランチャーを実行しているWindows 10の場合、システムにインストールされているすべてのJavaバージョンを動作させるために変更する必要がありました(java.exeおよびjavaw.exe)。
サイバービット

5
邪魔にならない亜種を使用しました。コマンドのショートカットを作成し、そのショートカットでjava -jar myJarFile.jar手順2〜5を実行しました(Windows 10、Java 8)。
ジュリアンクローネグ

1
私にとって、それはだったjavaw.exe
masterxilo

14

あなたがこの疑問に出くわしたが、実際にLinuxで動作するソリューションを探しているなら、これはあなたのためです。

javaアプリケーションを起動するバイナリにパラメーターを追加できる場合は、オプション-Dsun.java2d.uiScaleプロパティの値を渡して、Java2Dのスケーリング係数を指定できます。これにより、アプリケーションが拡張されます。スケーリング係数の値はdoubleです。このオプションjavaは、起動されたJavaアプリケーションではなく、バイナリ自体に必ず渡してください。

例:UIスケーリングファクター2.5でNearInfinity.jarを起動します

java -Dsun.java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar

この記事は一般にHiDPIシステムでLinuxを実行するのに非常に有用であり、Windowsでも同様に機能するものがあります:https : //wiki.archlinux.org/index.php/HiDPI


JFrameの場合は1のスケーリングを、JOptionPanesの場合はシステムのスケーリングを取得できるといいのですが、これは良いことです。
ネイト

1
私にはうまくいきません。
アテジュボネン

@AtteJuvonen「私の車は機能しません」と言う代わりに、あなたのために機能しないとき、あなたが試したこと、期待される結果、実際の結果を説明する新しい質問を投稿してください結果、使用したコマンドライン、およびもしあればエラーメッセージは何ですか?
クリスチャンヒュージャー

@ChristianHujer私はそのパラメーターを使用してJava Swingアプリを起動しようとしました(jarへのパスが異なることを除いて、回答のコマンドラインと同じコマンドライン)。アプリはスケーリングなしで起動されました。
アテジュボネン

失礼なようでしたら、申し訳ありません。FWIWこれについて新しい質問を投稿しましたが、サイトで許可されたらすぐに報奨金も投稿します。
アテジュボネン

10

解決策:JRE 9で実行します。

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

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

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


Java9がこれを修正すれば、本当に興奮します。
music2myear

3
これは、コードを再コンパイルする必要があることを指摘できません。同じJava 8アプリケーションをJava 9+で実行するだけでは動作は変わりません
-Ramhound

Java 9でHiDPIプログラムを実行すると、多くの問題が解決します。goo.gl/3zmL7b
Gernot Krost

3
@Ramhound再コンパイルする必要はありません。Java 8用のJDK8でjarを作成しました。これは、4Kスクリーンと200%スケール設定のW10システムでフルスクリーンJPanelのpaint()メソッドをオーバーライドします。Java 8のjava.exeで実行すると、メソッドに指定されたGraphics2Dオブジェクトのスケーリングは1になり、JPanelのgetWidth / heightは3840x2160になります。Java 9のjava.exeで実行し、スケーリングは2、幅/高さは1920x1080です。
ドリームスペースプレジデント

1
Java 9に新しいメソッドがあります:Screen.getPrimary()。getOutputScaleX(); 実際に動作します。(もう1つのオプションは、JavaFX画面サイズ(Screen.getPrimary()。getVisualBounds())を使用することです。これは、機能し、これをToolkit.getDefaultToolkit()。getScreenSize()に分割します。推測できることがわかります。選択したDPIで:200%は約2.0になりますが、残念なことに125%は1.0のスケーリングパーセンテージになります。 (ギャップ、パディングなどに使用)しませんでした
wax_lyrical

4

すべてのJava実行可能ファイルで「プロパティ」>「互換性」>「dpiスケーリングモード」を「システム」に設定するには、管理者PowerShell(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スケーリング設定を手動で変更することはできません。


2

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


3
幸いなことに、Fall Creatorsの更新プログラムでは、アイテムを右クリックし、プロパティを選択してから互換性タブを選択することにより、スケーリングの動作を変更できます。カスタムの外部マニフェストを作成する必要はなくなりました-これは素晴らしいことです。
リチャード

0

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

Java 10をお試しください。

-Dsun.java2d.dpiaware = falseはJava 9または10では機能しないことがわかりました。Java8および9の場合、swingアプリは小さいですが、Java 10はWindowsで適切にサイズ調整されます。

そのため、次のようなbatファイルから実行できるアプリの場合:java -jar xxx.jar

batファイルにJAVA_HOME = .... \ java_10およびPATH =%JAVA_HOME%\ bin;%PATH%を追加しました。

java -jar xxx.jar


-2

これらのソリューションのほとんどを試しましたが、私のために働いたのは、次の場所で見つけたファイルにシステム互換性モードを設定することでした:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath

2
スーパーユーザーへようこそ!回答として「ありがとう」や「これは私のために働いた」を追加しないでください。サイトにしばらく時間をかけると、あなたが好きな答えを投票するのに十分な特権を得ることができます。
ベルティエブ

これは、他の人の答えに対するコメントかもしれません。固定するためには、適用する必要があります互換性の設定をするjava.exe、および/またはjavaw.exeまたは他の推奨を使用しています。このjavapathフォルダーには、システムにインストールされている最新のJava実行可能ファイルへのリンクが含まれています。したがって、設定を適用するProgram Filesだけで十分です。
アレクセイイワノフ

-4

次のようなコマンドプロンプトを使用して実行すると、適切なdpiを取得できました。

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar

これは質問に実際には答えず、java.exeまたはの高DPI設定を変更しませんjavaw.exe
アレクセイ・イワノフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.