Yüksek çözünürlüklü bir ekranda yükseltilmiş Java uygulamalarını nasıl çalıştırırım?


73

Windows 10'da yüksek çözünürlüklü bir ekranda Java uygulaması (JAR dosyası) çalıştırmaya çalışıyorum. Uygulama Swing kullanıyor ve bu nedenle DPI farkında değil. Normalde DPI farkında olmayan bir uygulama çalıştırdığımda, Windows bulanık olsa da benim için ölçeklendirecek. Ancak bazı nedenlerden dolayı Java uygulamasını ölçeklendirmiyor; Köşede okunması imkansız bir metni olan küçük bir pencere açtım. Java uygulamasını Windows yüksek DPI (bulanık) ölçeklemeyle nasıl çalıştırabilirim?


Bu sizin uygulamanız mı ve kaynakları / nesneleri kontrol ediyor musunuz ya da şimdi değiştirilemeyen eski bir uygulama mı?
harrymc

3
Benim başvurum değil; kaynak üzerinde kontrol yok.
Jeff E,

Kötü haber, bu uygulamayı çalıştırmak için DPI'ınızı düşürmeniz gerekebilir. : Burada yardımcı olabilecek kesmek ile bazı kaynaklar şunlardır Windows 10'a bulanık yazı Fix , Windows 10'a DPI ayarları , Windows 10 DPI bulanık . En azından, denemeden önce bir sistem geri yükleme noktası yedeği oluşturun. Geri dönüş çözümü, Windows 7'ye geri dönmek olabilir.
harrymc

4
@harrymc Yukarıdakilerden biri nasıl yardım eder? Sorun bulanık yazı tipleri ya da çalışmayı reddetmesi değil, sorun her şeyin küçük olması . "Bulanık" font oluşturma, elde etmek istediğim şey ve OP'nin sorusunu anladığım gibi onlar da öyle. DPI ölçeklendirmesinin% 100 olarak ayarlanması tüm sistemi küçültecektir; ekran çözünürlüğünü yerel olmayan bir değere ayarlamak her şeyin bulanık görünmesini sağlar. (Tamam, benim için 1080p bir ekrandan daha bulanık değil, ama yine de.)
15

1
@harrymc İkincisi uygulamayı kullanılabilir hale getirebilirken, neden "X'i 2160p'lik bir ekranda nasıl çalıştırabilirim?" diye yanıtladığınızı anladığınızdan eminim. "daha kötü bir ekran kullan" ifadesiyle noksan eksik.
millimoose

Yanıtlar:


35

Buradaki sorun, Swing'in varsayılan olarak DPI farkında olduğunu iddia etmesidir, bu nedenle pencereler onu ölçeklendirmez. Bu davranışı kapatmak için bu düğmeyi kullanın, pencereler salıncak uygulamanızı ölçeklendirmeye başlar:

-Dsun.java2d.dpiaware=false

[EDIT: Maalesef, bu bayrak artık Java 8'de çalışmıyor gibi görünüyor, Java 6'da test ediyordum. Görünüşe göre bu bilinen bir sorun .]

[DÜZENLEME 2: EXE bildirimlerini değiştirmek için bir program kullanarak, Java 8 kurulumunu doğru çalışması için değiştirebilirsiniz. Java.exe ve javaw.exe içindeki bildirimlerde ayarını true değerinden false değerine değiştirdim ve şimdi Swing programlarım Windows 10 yüksek dpi'de düzgün biçimde ölçeklendi. Bunun için Kaynak Tuner kullandım .]

[Düzenle 3] Sadece Java 9 kullanın


# 2 numaralı düzenlemeyi açıklayabilir misiniz? Bildirimde tam olarak hangi ayarı değiştirdiniz?
Tomalak

Manifest XML'de, <asmv3: application> <asmv3: windowsSettings> altındaki <dpiAware> bayrağıdır
CarlG

Mesele bu. Bu bayrağı gördüm ve ayarladım false, ancak uygulama (JNLP / WebStart) her iki şekilde de düzgün ölçeklenmedi. Bunun işe yarayıp yaramadığını kontrol etmenin basit bir yolunu düşünebilir misiniz, örneğin, bu ayara cevap verdiğini bildiğiniz bir test uygulaması?
Tomalak 17:16

Web başlatması özellikle titiz, çünkü hangi jre dağıtımını kurduğunuzu tam olarak hangi çalıştırılabilir programda kullanacağınızı belirlemek zor olabilir. Çapraz kontrol olarak, uygulamanızı doğrudan java.exe veya javaw.exe ile başlatmayı ve fark olup olmadığını görmek için JWS atlamayı denerim.
CarlG,

4
Bu komik ve farcical arasında bir yerde. Çerçeve yeteneklerini yanlış raporlar ve hatayı düzelten anahtar kaldırılır. Tek mesele mi? Son kullanıcılar için bir 3. parti aracı satın almaları için. Ve insanlar Java'nın neden bu kadar itibarlı olmadığını merak ediyorlar.
Temel

65

Windows 10 makinemde kolay bir çözüm buldum:

  1. Bul java.exeyüklü.
  2. Sağ tık -> Properties
  3. CompatibilitySekmeye git
  4. Kontrol Override high DPI scaling behavior.
  5. seç SystemiçinScaling performed by:

4
En iyi çözüm - "C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" dosyasını değiştirmek zorunda kaldığım için .jnlp dosyasını çalıştırırken bu sorunu yaşadım ama bu cazibeye benziyordu.
Dror Harari

Benim için JDK versiyonuydu. Windows 10'da görev yöneticisindeki seçenekleri sağ tıklayıp açarak bulundu.
Brian Knoblauch

3
Java tabanlı Minecraft rampaları çalıştıran Windows 10'da, çalışması için sistemimde yüklü olan tüm Java sürümlerini değiştirmek zorunda kaldım (java.exe ve javaw.exe).
cyberbit

5
Daha az müdahaleci bir değişken kullandım. Komut için bir kısayol oluşturdum java -jar myJarFile.jarve bu kısayol için 2 ile 5 arasındaki adımları yaptım (Windows 10, Java 8).
Julien Kronegg

1
Benim için oldujavaw.exe
masterxilo

12

Bu soruyu tökezlediyseniz ancak gerçekte Linux üzerinde çalışan bir çözüm arıyorsanız, bu sizin için.

javaUygulamayı başlatan ikiliye parametreler ekleyebilirseniz , Java2D için ölçeklendirme faktörü belirtmek -Düzere sun.java2d.uiScaleproprty için bir değer iletme seçeneğini kullanabilirsiniz. Bu, uygulamanızı ölçeklendirir. Ölçekleme faktörü değeri iki katıdır. Bu seçeneği java, başlatılan Java uygulamasına değil, ikili dosyaya aktardığınızdan emin olun .

Örnek: NearInfinity.jar dosyasını 2.5 UI ölçeklendirme faktörü ile başlatın.

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

Bu makaleyi genel olarak Linux'u HiDPI sistemlerinde çalıştırmak için oldukça faydalı buldum ve bazı şeylerin Windows'da da çalışabileceği: https://wiki.archlinux.org/index.php/HiDPI


Bu iyi, keşke JFrame için 1 ölçekleme ve JOptionPanes için sistem ölçeklendirme yapabilseydim.
Nate,

1
Benim için çalışmıyor.
Atte Juvonen

@AtteJuvonen Sadece "arabamın işe yaramadığını" söylemek yerine, sizin için işe yaramadığında, neden denediğinizi, beklenen sonucun ne olduğunu, gerçekte ne olduğunu anlatan yeni bir soru yayınlamıyorsunuz sonuç, hangi komut satırını kullandınız ve varsa hata mesajlarınız neler?
Christian Hujer

@ChristianHujer Bu parametre ile Java Swing uygulamamı başlatmaya çalıştım (cevabınızdakiyle aynı komut satırı, kavanozun yolu hariç) ve uygulama ölçeklendirilmeden başlatıldı.
Atte Juvonen

Kaba gözükürsem özür dilerim, hiçbir şey çalışmadığında sinirlenir. FWIW Bu konuda yeni bir soru yayınladım ve site bana izin verir vermez bir lütuf göndereceğim.
Atte Juvonen

10

Çözüm: JRE 9'da çalıştırın.

Bunun sebebi Java çalışma zamanının kendisini "DPI farkında" olarak ilan etmesiydi ancak AWT ve Swing için desteklemiyordu. Java uygulamaları, düzgün şekilde ölçeklendirilmek yerine piksellere göre boyutlandırıldı ve oluşturuldu; bu, HiDPI ekranları içeriyordu. Neyse, bu yakın zamanda çözüldü. Sorunu Bkz Windows ve Linux üzerinde HiDPI Grafik: JEP 263 ve yükseltme .

Bu nedenle, yazı tipi boyutunu artırmak işe yaramaz (çünkü diğer her şeyi arttırmaz); jvm argümanı -Dsun.java2d.dpiaware=falseçalışmıyor (çünkü gerçekten desteklenmiyor); ve manifest dosyası + kayıt defteri düzenleme (Windows için) sadece çalışmıyor.

Ardından, JRE 9'da çalıştırmanız gerekiyor, çünkü bu özelliği gerçekten destekliyor.


Java 9 bunu düzeltirse gerçekten heyecanlanacağım.
music2myear

3
Bu, kodu yeniden derlemeniz gerektiğine işaret etmez. Yalnızca aynı Java 8- uygulamasını Java 9+ işletim sisteminde çalıştırmak, davranışı değiştirmez
Ramhound

Java 9'da HiDPI programlarını çalıştırmak birçok sorunu çözer . goo.gl/3zmL7b
Gernot Krost

3
@Ramhound Yeniden derlemek zorunda değilsiniz. Java 8 için JDK8 olan ve 4K ekran ve% 200 ölçek ayarlı bir W10 sistemindeki tam ekran JPanel'in paint () yöntemini geçersiz kılan bir kavanoz inşa ettim. Java 8'in java.exe'si ile çalıştırın, yönteme verilen Graphics2D nesnesi 1 ölçeklendirmeye sahip ve JPanel ise 3840x2160 getWidth / height değerine sahip. Java 9 java.exe ile çalıştırın, ölçeklendirme 2 ve genişlik / yükseklik 1920x1080.
Dreamspace Başkanı

1
Java 9'da yeni bir yöntem bulacaksınız: Screen.getPrimary (). GetOutputScaleX (); bu aslında işe yarıyor. (Diğer seçenek, çalışan JavaFX ekran boyutunu (Screen.getPrimary (). GetVisualBounds ()) kullanmak ve bunu Toolkit.getDefaultToolkit () 'e göre bölmek. seçilen DPI'da:% 200, yaklaşık olarak 2.0 ile sonuçlanacak, ancak maalesef% 125, hala 1.0 Ölçekleme yüzdesiyle sonuçlanıyor, ancak, Java9'a taşındıktan sonra bile: GUI'leri, düğmeler genişledikçe tamamen yok etti, ancak bazı sabitler (boşluklar, dolgu vb. için kullanılır.) yapılmadı
wax_lyrical

4

Tüm java çalıştırılabilir dosyalarının bir yönetici powershell'de (win-x, a) yönetici olarak "özellik> uyumluluk> dpi ölçeklendirme modu" "Sistem" olarak ayarlanması için zorlayın:

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

geri almak için:

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

HKCU yerine HKLM kullanabilirsiniz, ancak daha sonra java * .exe dosyalarının özellikler> uyumluluk iletişim kutusundaki dpi-ölçekleme ayarını el ile değiştiremezsiniz.


2

PreferExternalManifest komutunu regedit'te ayarlamanız ve https://stackoverflow.com/a/39372897 aşağıdaki stackoverflow yanıtında verilen şekilde java.exe ve javaw.exe için özel bildirimler oluşturmanız gerekir.


2
İyi haber, Fall Creators güncellemesi, öğeye sağ tıklayarak, özellikleri seçip ardından uyumluluk sekmesini kullanarak ölçekleme davranışını değiştirmenize olanak sağlar. Özel bir dış manifesto oluşturmak artık gerekli değil - bu güzel.
Richard

2

Kenneth için teşekkürler. Ben bulmak C:\Program Files (x86)\Java\jre\bin\java.exeo right click -> properties -> compatibility tab -> "override high DPI scaling behavior"basıp Systemsonra da değiştirmek için aynı şekilde çalıştı works.I, javaw.exe'ın uyumluluk, aynı zamanda çalışır.

Not: burpsuite.jarBu yöntemi kullanarak win10 1703 kullanıyorum.


0

Elderry'nin çözümü iyi, ama ya Windows'da bir jar dosyası çalıştırmak istiyorsanız ve uyumluluk seçenekleri yoksa?

C: \ Program Files (x86) \ Java \ jre \ bin konumuna gidin ve javaw.exe dosyasını bulun. Sağ tıklayın, özellikler, uyumluluk sekmesi, "yüksek DPI ölçeklendirme davranışını geçersiz kıl" seçeneğini işaretleyin ve "Sistem" i seçin ("Gelişmiş" seçeneğinin benim için çalışmadığını unutmayın).

Şimdi jar dosyası pencereleri okunabilir metinle uygun şekilde ölçeklenmelidir. Aksi halde, Windows'un kavanoz tipi dosyaları javaw.eve ile gerektiği gibi ilişkilendirmediği anlamına gelebilir. Üçüncü taraf düzeltmeleri şu adreste mevcuttur: https://johann.loefflmann.net/en/software/jarfix/index.html


0

Java 10'u deneyin.

-Dsun.java2d.dpiaware = false'ın Java 9 veya 10'da çalışmadığını gördüm. Ayrıca, Java 8 ve 9 için benim salıncak uygulamam küçük, fakat Java 10'da Windows'ta düzgün boyutlarda!

Yani gibi bir yarasa dosyasından çalıştırabilirsiniz bir uygulama için: java -jar xxx.jar

Sadece yarasa dosyasına JAVA_HOME = .... \ java_10 ve PATH =% JAVA_HOME% \ bin;% PATH% ekledim.

java -jar xxx.jar


-1

Bu çözümlerin çoğunu denedim, ancak benim için çalışan, aşağıdaki konumda bulduğum dosyalarda sistem uyumluluğu modunu ayarlamaktı:

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

1
Süper Kullanıcıya Hoşgeldiniz! Lütfen cevap olarak "teşekkür" veya "bu benim için çalıştı" eklemeyin. Siteye biraz zaman ayırın ve beğendiğiniz yanıtları düzeltmek için yeterli ayrıcalıklara sahip olacaksınız.
bertieb

-3

Gibi komut istemi kullanarak koştu mantıklı dpi elde edebildi:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.