Bagaimana cara menjalankan aplikasi Java yang ditingkatkan pada tampilan DPI tinggi?

75

Saya mencoba menjalankan aplikasi Java (file JAR) pada layar DPI tinggi pada Windows 10. Aplikasi ini menggunakan Swing dan karenanya tidak menyadari DPI. Biasanya ketika saya menjalankan aplikasi yang tidak menyadari DPI, Windows akan mengatur skala untuk saya, meskipun buram. Tetapi untuk beberapa alasan itu tidak meningkatkan aplikasi Java; Saya hanya mendapatkan jendela kecil di sudut dengan teks yang mustahil dibaca. Bagaimana cara menjalankan aplikasi Java dengan penskalaan DPI tinggi (kabur) Windows?

Jeff E
sumber
Apakah ini aplikasi Anda dan apakah Anda mengontrol sumber / objek, atau aplikasi warisan yang sekarang tidak dapat diubah?
harrymc
3
Itu bukan aplikasi saya; tidak ada kontrol atas sumbernya.
Jeff E
Berita buruk, Anda mungkin perlu menurunkan DPI untuk menjalankan aplikasi itu. Berikut adalah beberapa sumber daya dengan peretas yang mungkin membantu: Memperbaiki font buram di Windows 10 , Pengaturan DPI di Windows 10 , Windows 10 DPI buram . Buat setidaknya cadangan titik pemulihan sistem sebelum mencobanya, untuk berjaga-jaga. Solusi fallback mungkin untuk kembali ke Windows 7.
harrymc
5
@harrymc Bagaimana salah satu dari bantuan di atas? Masalahnya bukan font yang buram atau menolak dijalankan, masalahnya adalah semuanya kecil . Render font "buram" adalah apa yang ingin saya capai, dan ketika saya memahami pertanyaan OP, mereka juga melakukannya. Mengatur skala DPI ke 100% akan membuat seluruh sistem kecil; mengatur resolusi tampilan ke yang non-pribumi akan membuat segalanya tampak buram. (Oke, tidak ada blurrier selain pada layar 1080p untuk saya, tapi tetap saja.)
Millimoose
1
@harrymc Dan sementara yang terakhir mungkin membuat aplikasi dapat digunakan, saya yakin Anda mengerti mengapa menjawab "bagaimana saya membuat X bekerja pada layar 2160p?" dengan "menggunakan layar yang lebih buruk" adalah semacam kehilangan intinya.
milimoose

Jawaban:

37

Masalahnya di sini tampaknya adalah bahwa Swing secara default mengklaim bahwa DPI sadar, jadi windows tidak skala itu. Gunakan sakelar ini untuk mematikan perilaku ini dan windows akan mulai menskala aplikasi ayun Anda:

-Dsun.java2d.dpiaware=false

[EDIT: Sayangnya, flag ini sepertinya tidak lagi berfungsi di Java 8, saya sedang mengujinya di Java 6. Sepertinya ini adalah masalah yang diketahui .]

[EDIT 2: Anda dapat memodifikasi instalasi Java 8 agar berfungsi dengan benar, menggunakan program untuk memodifikasi manifes EXE. Saya mengubah pengaturan dari true ke false dalam manifes di dalam java.exe dan javaw.exe, dan sekarang program Swing saya berskala dengan benar pada Windows 10 dpi tinggi. Saya menggunakan Resource Tuner untuk ini.]

[Sunting 3] Cukup gunakan Java 9

CarlG
sumber
Bisakah Anda menguraikan edit # 2? Pengaturan mana yang Anda modifikasi dalam manifes, tepatnya?
Tomalak
Dalam Manifest XML, itu adalah bendera <dpiAware> di bawah <asmv3: application> <asmv3: windowsSettings>
CarlG
Itulah intinya. Saya telah melihat bendera itu dan saya mengaturnya false, tetapi aplikasi (JNLP / WebStart) tidak skala dengan baik. Bisakah Anda memikirkan cara sederhana untuk melakukan pengecekan silang apakah ini berfungsi atau tidak, mis. Aplikasi uji yang Anda tahu yang merespons pengaturan ini?
Tomalak
Webstart sangat rewel karena mungkin sulit untuk menentukan dengan tepat executable mana di mana Anda menginstal distro yang akhirnya Anda gunakan. Sebagai pemeriksaan silang, saya akan mencoba meluncurkan aplikasi Anda langsung dengan java.exe atau javaw.exe dan melewatkan JWS untuk melihat apakah ada perbedaan.
CarlG
4
Ini adalah suatu tempat antara lucu dan lucu. Kerangka kerja salah melaporkan kapabilitasnya dan sakelar yang memperbaiki kesalahan dihapus. Satu-satunya jalan keluar? Untuk pengguna akhir untuk membeli alat pihak ke-3. Dan orang-orang bertanya-tanya mengapa Jawa memiliki reputasi yang buruk.
Dasar
68

Baru saja menemukan solusi mudah di mesin Windows 10 saya:

  1. Temukan java.exeAnda terinstal.
  2. Klik kanan -> Properties
  3. Buka Compatibilitytab
  4. Memeriksa Override high DPI scaling behavior.
  5. Pilih SystemuntukScaling performed by:
Elderry
sumber
5
Solusi terbaik - Saya mengalami masalah saat menjalankan file .jnlp jadi saya harus mengubah "C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" tetapi ini bekerja seperti pesona.
Dror Harari
Bagi saya itu adalah versi JDK. Ditemukan dengan mengklik kanan dan membuka opsi dari task manager di Windows 10.
Brian Knoblauch
3
Untuk Windows 10, menjalankan peluncur Minecraft berbasis Java, saya harus mengubah semua versi Java yang terinstal di sistem saya agar bisa berfungsi (java.exe dan javaw.exe).
cyberbit
5
Saya menggunakan varian yang tidak terlalu mengganggu. Saya membuat pintasan untuk perintah java -jar myJarFile.jardan melakukan langkah 2 hingga 5 pada pintasan itu (Windows 10, Java 8).
Julien Kronegg
1
Bagi saya, itu adalahjavaw.exe
masterxilo
14

Jika Anda menemukan pertanyaan ini tetapi sebenarnya mencari solusi yang berfungsi di Linux, ini untuk Anda.

Jika Anda bisa menambahkan parameter ke javabiner yang meluncurkan aplikasi, Anda bisa menggunakan opsi -Duntuk memberikan nilai untuk sun.java2d.uiScaleproprty untuk menentukan faktor penskalaan untuk Java2D. Ini akan mengukur aplikasi Anda. Nilai faktor penskalaan adalah ganda. Pastikan Anda meneruskan opsi ini ke javabiner itu sendiri, bukan aplikasi Java yang diluncurkan.

Contoh: Luncurkan NearInfinity.jar dengan faktor penskalaan UI 2,5

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

Saya menemukan artikel ini cukup berguna secara umum untuk menjalankan Linux pada sistem HiDPI, dan beberapa hal juga dapat bekerja pada Windows: https://wiki.archlinux.org/index.php/HiDPI

Christian Hujer
sumber
Ini bagus, meskipun saya berharap saya bisa mendapatkan skala 1 untuk JFrames dan skala sistem untuk JOptionPanes.
NateS
1
Tidak bekerja untuk saya.
Atte Juvonen
@ AntteJuvonen Alih-alih hanya mengatakan "mobil saya tidak bekerja", ketika itu tidak bekerja untuk Anda, mengapa Anda tidak mengirim pertanyaan baru yang menggambarkan apa yang Anda coba, apa hasil yang diharapkan, apa yang sebenarnya hasil, baris perintah apa yang Anda gunakan, dan apa, jika ada, pesan kesalahan yang Anda dapatkan?
Christian Hujer
@ChristianHujer Saya mencoba meluncurkan aplikasi Java Swing saya dengan parameter itu (baris perintah yang sama dengan yang ada di jawaban Anda, kecuali path to jar berbeda) dan aplikasi diluncurkan tanpa penskalaan.
Atte Juvonen
Maaf jika saya tampak kasar, frustrasi ketika tidak ada yang berhasil. FWIW saya memposting pertanyaan baru tentang ini dan saya juga akan mengirim hadiah segera setelah situs mengizinkan saya.
Atte Juvonen
10

Solusi: Jalankan di JRE 9.

Ini karena Java runtime menyatakan dirinya "DPI-aware" tetapi tidak benar-benar mendukungnya untuk AWT dan Swing. Aplikasi Java berukuran dan dirender berdasarkan piksel alih-alih diskalakan dengan benar, ini termasuk tampilan HiDPI. Bagaimanapun, ini telah diselesaikan baru-baru ini. Lihat masalah JEP 263: Grafik HiDPI pada Windows dan Linux dan peningkatannya .

Jadi, meningkatkan ukuran font tidak berfungsi (karena tidak meningkatkan sisanya); argumen jvm -Dsun.java2d.dpiaware=falsetidak berfungsi (karena tidak benar-benar didukung); dan file manifest + edit registry (untuk Windows) tidak berfungsi.

Kemudian, Anda perlu menjalankannya di JRE 9 karena sangat mendukung fitur ini.

Sergio Muriel
sumber
Saya akan sangat senang jika Java9 memperbaiki ini.
music2myear
3
Ini gagal menunjukkan Anda harus mengkompilasi ulang kode. Cukup menjalankan aplikasi Java 8- yang sama di Java 9+ tidak akan mengubah perilaku
Ramhound
Menjalankan program HiDPI di Java 9 memecahkan banyak masalah. goo.gl/3zmL7b
Gernot Krost
3
@Ramhound Anda tidak perlu mengkompilasi ulang. Saya baru saja membuat toples dengan JDK8 untuk Java 8 yang menggantikan metode JPanel fullscreen () pada sistem W10 dengan layar 4K dan pengaturan skala 200%. Jalankan dengan java.exe Java 8, objek Graphics2D yang diberikan untuk metode ini memiliki skala 1, dan JPanel memiliki getWidth / tinggi 3840x2160. Jalankan dengan java.exe Java 9, penskalaannya 2 dan lebar / tinggi 1920x1080.
Dreamspace President
1
Anda akan menemukan metode baru di Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); yang sebenarnya bekerja. (Opsi lainnya adalah menggunakan ukuran layar JavaFX, (Screen.getPrimary (). GetVisualBounds ()) yang berfungsi, dan bagikan ini dengan Toolkit.getDefaultToolkit (). GetScreenSize (), Anda akan menemukan bahwa Anda bisa menebak pada DPI yang dipilih: 200% akan menghasilkan sekitar 2.0, tapi sayangnya 125% masih menghasilkan persentase penskalaan 1.0. Namun, bahkan setelah pindah ke Java9: Saya menemukan GUI saya benar-benar hancur ketika tombol diperluas, tetapi beberapa konstanta (digunakan untuk celah, padding dll) tidak
wax_lyrical
4

Untuk memaksa semua executable java untuk memiliki "properties> kompatibilitas> mode penskalaan dpi" set ke "System", di administrator powershell (win-x, a), jalankan:

$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}

untuk membatalkan:

$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /f}

Alih-alih HKCU Anda bisa menggunakan HKLM, tetapi kemudian Anda tidak dapat mengubah pengaturan penskalaan dpi secara manual lagi di dialog properties> kompatibilitas file java * .exe.

masterxilo
sumber
2

Anda perlu mengatur PreferExternalManifest di regedit dan membuat manifes khusus untuk java.exe dan javaw.exe seperti yang diberikan dalam jawaban stackoverflow berikut https://stackoverflow.com/a/39372897

droidlabel
sumber
3
Berita bagus, pembaruan Fall Creators memungkinkan Anda mengubah perilaku penskalaan dengan mengklik kanan pada item, memilih properti, lalu tab kompatibilitas. Membuat manifes eksternal khusus tidak lagi diperlukan - yang bagus.
Richard
0

Solusi Elderry baik, tetapi bagaimana jika Anda ingin menjalankan file jar pada Windows dan tidak memiliki opsi kompatibilitas?

Pergi ke C: \ Program Files (x86) \ Java \ jre \ bin dan temukan javaw.exe. Klik kanan, properti, tab kompatibilitas, centang "timpa perilaku penskalaan DPI tinggi" dan pilih "Sistem" (Perhatikan bahwa "Peningkatan sistem" tidak berfungsi untuk saya).

Sekarang file jar windows harus skala dengan teks yang dapat dibaca. Jika tidak, itu mungkin berarti bahwa Windows tidak menautkan file jenis jar ke javaw. Seperti yang seharusnya. Perbaikan pihak ketiga tersedia di: https://johann.loefflmann.net/en/software/jarfix/index.html

Kenneth
sumber
0

Coba Java 10.

Saya menemukan bahwa -Dsun.java2d.dpiaware = false tidak berfungsi di Java 9 atau 10. Juga untuk Java 8 dan 9 aplikasi swing saya kecil, tetapi ukuran Java 10 di windows!

jadi untuk aplikasi yang bisa Anda jalankan dari file bat seperti: java -jar xxx.jar

Saya baru saja menambahkan JAVA_HOME = .... \ java_10 dan PATH =% JAVA_HOME% \ bin;% PATH% dalam file bat.

java -jar xxx.jar

Stan Towianski
sumber
-2

Saya mencoba sebagian besar solusi ini, tetapi yang bekerja untuk saya adalah mengatur mode kompatibilitas sistem pada file yang saya temukan di lokasi berikut:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
Ryan Reynolds
sumber
2
Selamat Datang di Pengguna Super! Tolong jangan tambahkan "terima kasih" atau "ini bekerja untuk saya" sebagai jawaban. Investasikan waktu di situs ini dan Anda akan memperoleh hak istimewa yang cukup untuk meningkatkan jawaban yang Anda sukai, yang merupakan cara Pengguna Super mengucapkan terima kasih.
bertieb
Ini bisa menjadi komentar atas jawaban orang lain. Untuk memperbaikinya, perlu menerapkan pengaturan kompatibilitas ke java.exedan / javaw.exeatau menggunakan rekomendasi lainnya. The javapathfolder berisi link ke executable Java terbaru diinstal pada sistem. Dengan demikian menerapkan pengaturan di Program Filesharus cukup.
Alexey Ivanov
-4

Saya bisa mendapatkan dpi yang masuk akal ketika berlari menggunakan command prompt seperti:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
pengguna3301455
sumber
Ini tidak menjawab pertanyaan dengan sungguh-sungguh, dan itu tidak mengubah pengaturan DPI Tinggi java.exeatau javaw.exe.
Alexey Ivanov