ฉันจะรันแอพ Java ที่มีการลดอัตราการแสดงผลบนหน้าจอ DPI สูงได้อย่างไร


75

ฉันกำลังพยายามเรียกใช้แอป Java (ไฟล์ JAR) บนหน้าจอความละเอียดสูง DPI ใน Windows 10 แอปนี้ใช้ Swing และไม่ทราบ DPI โดยปกติเมื่อฉันเรียกใช้แอปพลิเคชันที่ไม่ทราบ DPI Windows จะปรับขนาดให้ฉันแม้ว่าจะพร่ามัว แต่ด้วยเหตุผลบางอย่างมันไม่ได้ปรับขนาดแอป Java ฉันเพิ่งเห็นหน้าต่างเล็ก ๆ เล็ก ๆ ตรงมุมพร้อมข้อความที่อ่านไม่ได้ ฉันจะรันแอพ Java ที่มีการปรับสเกลสูง DPI (เบลอ) ของ Windows ได้อย่างไร


เป็นแอปพลิเคชันของคุณและคุณควบคุมแหล่งที่มา / วัตถุหรือเป็นแอปพลิเคชันดั้งเดิมที่ไม่สามารถเปลี่ยนได้ในขณะนี้
harrymc

3
มันไม่ใช่ใบสมัครของฉัน ไม่มีการควบคุมแหล่งที่มา
Jeff E

ข่าวร้ายคุณอาจต้องลด DPI ของคุณเพื่อเรียกใช้แอปพลิเคชันนั้น นี่ทรัพยากรบางอย่างกับ hacks ที่อาจช่วยคือ: แก้ไขแบบอักษรเบลอใน Windows 10 , การตั้งค่า DPI ใน Windows 10 , วินโดวส์ 10 DPI พร่ามัว สร้างการสำรองข้อมูลจุดคืนค่าระบบอย่างน้อยก่อนที่จะลองใช้ในกรณี โซลูชันสำรองอาจกลับสู่ Windows 7
harrymc

5
@harrymc วิธีใดจะช่วยได้บ้าง? ปัญหาไม่ได้อยู่แบบอักษรเบลอหรือว่ามันปฏิเสธที่จะทำงานที่เป็นปัญหาว่าทุกอย่างเล็ก ๆ การแสดงแบบอักษร "พร่ามัว" เป็นสิ่งที่ฉันต้องการบรรลุและเมื่อฉันเข้าใจคำถามของ OP พวกเขาก็ทำได้เช่นกัน การปรับสเกล DPI เป็น 100% จะทำให้ทั้งระบบเล็ก การตั้งค่าความละเอียดการแสดงผลเป็นค่าที่ไม่ใช่เจ้าของภาษาจะทำให้ทุกอย่างดูเบลอ (เอาล่ะไม่มี blurrier กว่าบนจอแสดงผลความละเอียด 1080p สำหรับฉัน แต่ยังคง.)
millimoose

1
@harrymc และในขณะที่หลังอาจทำให้แอปใช้งานได้ฉันแน่ใจว่าคุณเข้าใจว่าทำไมตอบ "ฉันจะทำให้ X ทำงานบนจอแสดงผล 2160p ได้อย่างไร" ด้วย "ใช้การแสดงที่แย่ลง" เป็นจุดที่ขาดหายไป
millimoose

คำตอบ:


37

ปัญหาที่เกิดขึ้นในที่นี้ดูเหมือนว่า Swing นั้นเป็นค่าเริ่มต้นโดยอ้างว่าเป็น DPI ที่รับรู้ดังนั้น windows จึงไม่ปรับขนาด ใช้สวิตช์นี้เพื่อปิดพฤติกรรมนี้และหน้าต่างจะเริ่มปรับขนาดแอปการแกว่งของคุณ:

-Dsun.java2d.dpiaware=false

[แก้ไข: น่าเสียดายที่การตั้งค่าสถานะนี้ดูเหมือนว่าจะไม่ทำงานใน Java 8 อีกต่อไปฉันกำลังทดสอบใน Java 6 ดูเหมือนว่านี่เป็นปัญหาที่ทราบแล้ว]

[แก้ไข 2: คุณสามารถแก้ไขการติดตั้ง Java 8 ให้ทำงานอย่างถูกต้องโดยใช้โปรแกรมเพื่อแก้ไขรายการ EXE ฉันเปลี่ยนการตั้งค่าจากจริงเป็นเท็จในรายการภายใน java.exe และ javaw.exe และตอนนี้โปรแกรม Swing ของฉันปรับขนาดได้อย่างถูกต้องใน Windows 10 dpi สูง ฉันใช้ตัวปรับทรัพยากรเพื่อสิ่งนี้]

[แก้ไข 3] เพียงใช้จาวา 9


คุณอธิบายรายละเอียดเกี่ยวกับการแก้ไข # 2 ได้ไหม? การตั้งค่าใดที่คุณปรับเปลี่ยนในไฟล์ Manifest
Tomalak

ใน Manifest XML เป็นแฟล็ก <dpiAware> ภายใต้ <asmv3: application> <asmv3: windowsSettings>
CarlG

นั่นคือประเด็น ฉันเคยเห็นการตั้งค่าสถานะนั้นและฉันตั้งค่าเป็นfalseแต่แอปพลิเคชัน (JNLP / WebStart) ไม่ได้ปรับขนาดอย่างเหมาะสมทั้งสองวิธี คุณลองนึกถึงวิธีง่ายๆในการตรวจสอบข้ามว่ามันใช้งานได้หรือไม่เช่นแอปทดสอบที่คุณรู้ว่าตอบสนองต่อการตั้งค่านี้หรือไม่?
Tomalak

Webstart มีความพิถีพิถันเป็นพิเศษเพราะมันยากที่จะระบุตำแหน่งที่สามารถใช้งานได้ซึ่งคุณติดตั้งเมื่อใช้งาน ในฐานะที่เป็น cross-check ฉันจะลองเปิดแอพของคุณโดยตรงด้วย java.exe หรือ javaw.exe และข้าม JWS เพื่อดูว่ามีความแตกต่างหรือไม่
CarlG

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" แต่วิธีนี้ใช้งานได้ดี
Dror Harari

สำหรับฉันมันเป็นรุ่น JDK ค้นพบโดยคลิกขวาและเปิดตัวเลือกจากตัวจัดการงานใน Windows 10
Brian Knoblauch

3
สำหรับ Windows 10 ที่ใช้ตัวเรียกใช้ Minecraft บน Java ฉันต้องเปลี่ยน Java เวอร์ชันที่ติดตั้งทั้งหมดในระบบเพื่อให้ทำงานได้ (java.exe และ javaw.exe)
cyberbit

5
ฉันใช้ตัวแปรที่รบกวนน้อยกว่า ฉันสร้างทางลัดสำหรับคำสั่งjava -jar myJarFile.jarและทำตามขั้นตอนที่ 2 ถึง 5 บนทางลัดนั้น (Windows 10, Java 8)
Julien Kronegg

1
สำหรับฉันมันเป็นjavaw.exe
masterxilo

14

หากคุณสะดุดกับคำถามนี้ แต่กำลังมองหาวิธีการแก้ปัญหาที่ใช้งานได้บน Linux นี่คือสิ่งที่คุณต้องการ

หากคุณสามารถเพิ่มพารามิเตอร์ลงในjavaไบนารีที่เรียกใช้แอปพลิเคชันคุณสามารถใช้ตัวเลือก-Dในการส่งค่าสำหรับsun.java2d.uiScaleproprty เพื่อระบุตัวประกอบการปรับขนาดสำหรับ Java2D นี่จะเป็นการขยายขนาดใบสมัครของคุณ ค่าตัวคูณมาตราส่วนเป็นสองเท่า ตรวจสอบให้แน่ใจว่าคุณผ่านตัวเลือกนี้ไปยังjavaไบนารีเองไม่ใช่แอปพลิเคชัน Java ที่เปิดใช้งาน

ตัวอย่าง: เรียกใช้ NearInfinity.jar พร้อมตัวคูณมาตราส่วน UI ที่ 2.5

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

ฉันพบบทความนี้ค่อนข้างมีประโยชน์โดยทั่วไปสำหรับการใช้งาน Linux บนระบบ HiDPI และบางสิ่งอาจทำงานบน Windows เช่นกัน: https://wiki.archlinux.org/index.php/HiDPI


นี่เป็นสิ่งที่ดีแม้ว่าฉันหวังว่าฉันจะได้รับขนาด 1 สำหรับ JFrames และระบบจะขยายขนาดสำหรับ JOptionPanes
NateS

1
ใช้งานไม่ได้สำหรับฉัน
Atte Juvonen

@AtteJuvonen แทนที่จะบอกว่า "รถของฉันไม่ทำงาน" เมื่อมันไม่ได้ผลสำหรับคุณทำไมคุณไม่โพสต์คำถามใหม่อธิบายสิ่งที่คุณได้ลองสิ่งที่คาดหวังผลสิ่งที่เป็นจริง ผลลัพธ์บรรทัดคำสั่งที่คุณใช้และอะไรถ้ามีข้อความแสดงข้อผิดพลาดที่คุณได้รับ
Christian Hujer

@ChristianHujer ฉันพยายามเปิดตัวแอป Java Swing ของฉันด้วยพารามิเตอร์นั้น (บรรทัดคำสั่งเดียวกับที่คุณตอบยกเว้นว่าเส้นทางไปยังโถแตกต่างกัน) และแอปเปิดตัวโดยไม่ต้องปรับขนาด
Atte Juvonen

ขออภัยถ้าฉันดูหยาบเพียงผิดหวังเมื่อไม่มีอะไรทำงาน FWIW ฉันได้โพสต์คำถามใหม่เกี่ยวกับเรื่องนี้และฉันจะโพสต์เงินรางวัลในทันทีที่ไซต์อนุญาตให้ฉัน
Atte Juvonen

10

การแก้ไข: เรียกใช้บน JRE 9

นี่เป็นเพราะรันไทม์ Java ประกาศว่าตัวเอง "รู้ DPI" แต่ไม่สนับสนุน AWT และ Swing จริงๆ แอ็พพลิเคชัน Java มีขนาดและเรนเดอร์ตามพิกเซลแทนที่จะถูกปรับขนาดอย่างเหมาะสมซึ่งรวมถึงการแสดงผล HiDPI อย่างไรก็ตามเรื่องนี้ได้รับการแก้ไขเมื่อเร็ว ๆ นี้ ดูปัญหาJEP 263: HiDPI กราฟิกบน Windows และ Linux และอัพเกรด

ดังนั้นการเพิ่มขนาดตัวอักษรจึงไม่ทำงาน (เพราะจะไม่เพิ่มส่วนที่เหลือ) อาร์กิวเมนต์ jvm -Dsun.java2d.dpiaware=falseไม่ทำงาน (เพราะไม่ได้รับการสนับสนุนจริง ๆ ); และไฟล์ Manifest + การแก้ไขรีจิสทรี (สำหรับ Windows) จะไม่ทำงาน

จากนั้นคุณต้องเรียกใช้บน JRE 9 เพราะรองรับคุณสมบัตินี้จริงๆ


ฉันจะตื่นเต้นจริง ๆ ถ้า Java9 แก้ไขปัญหานี้
music2myear

3
สิ่งนี้ล้มเหลวในการชี้ให้เห็นว่าคุณต้องคอมไพล์โค้ดใหม่ เพียงแค่เรียกใช้แอปพลิเคชัน Java 8- เดียวกันบน Java 9+ จะไม่เปลี่ยนพฤติกรรม
Ramhound

ใช้โปรแกรม HiDPI ชวา 9 แก้มากปัญหา goo.gl/3zmL7b
Gernot Krost

3
@ แรมฮาวด์คุณไม่ต้องคอมไพล์ใหม่ ฉันเพิ่งสร้าง jar ด้วย JDK8 สำหรับ Java 8 ที่แทนที่เมธอด paint () แบบเต็มหน้าจอของ JPanel ในระบบ W10 ที่มีหน้าจอ 4K และการตั้งค่ามาตราส่วน 200% รันด้วย java.exe ของ Java 8 วัตถุ Graphics2D ที่กำหนดให้กับเมธอดนั้นมีขนาดเท่ากับ 1 และ JPanel มี getWidth / height ของ 3840x2160 รันด้วย java.exe ของ Java 9 สเกลคือ 2 และความกว้าง / ความสูงคือ 1920x1080
ประธานาธิบดี Dreamspace

1
คุณจะพบวิธีการใหม่ใน Java 9: ​​Screen.getPrimary (). getOutputScaleX (); ซึ่งใช้งานได้จริง (ตัวเลือกอื่นคือใช้ขนาดหน้าจอ JavaFX, (Screen.getPrimary (). getVisualBounds ())) ซึ่งใช้งานได้และแบ่งสิ่งนี้กับ Toolkit.getDefaultToolkit (). getScreenSize () คุณจะพบว่าคุณสามารถเดาได้ ที่ DPI ที่เลือก: 200% จะส่งผลเกี่ยวกับ 2.0 แต่น่าเสียดายที่ 125% ยังคงส่งผลให้สัดส่วนการขยายตัว 1.0 อย่างไรก็ตามแม้หลังจากย้ายไป Java9: ฉันพบ GUIs ของฉันทั้งหมดถูกทำลายอย่างสิ้นเชิงเมื่อปุ่มขยาย (ใช้สำหรับช่องว่างช่องว่างภายใน ฯลฯ ) ไม่ได้
wax_lyrical

4

ในการบังคับให้โปรแกรมเรียกทำงานจาวาทั้งหมดมี "คุณสมบัติ> ความเข้ากันได้> โหมดปรับสเกล 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 ได้ แต่คุณไม่สามารถเปลี่ยนการตั้งค่า dpi-scaling ด้วยตนเองได้อีกต่อไปในกล่องโต้ตอบคุณสมบัติ> ความเข้ากันได้ของไฟล์ java * .exe


2

คุณต้องตั้งค่า PreferExternalManifest ใน regedit และสร้างรายการที่กำหนดเองสำหรับ java.exe และ javaw.exe ตามที่กำหนดในคำตอบของ stackoverflow ต่อไปนี้ https://stackoverflow.com/a/39372897


3
ข่าวดีอัปเดต Fall Builders ช่วยให้คุณเปลี่ยนพฤติกรรมการปรับขนาดได้โดยคลิกขวาที่รายการเลือกคุณสมบัติแล้วไปที่แท็บความเข้ากันได้ การสร้างรายการภายนอกที่กำหนดเองไม่จำเป็นอีกต่อไป - ซึ่งเป็นสิ่งที่ดี
Richard

0

โซลูชันของ Elderry นั้นดี แต่ถ้าคุณต้องการเรียกใช้ไฟล์ jar บน Windows และไม่มีตัวเลือกความเข้ากันได้

ไปที่ 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 นอกจากนี้สำหรับ Java 8 และ 9 แอปการแกว่งของฉันมีขนาดเล็ก แต่ Java 10 ขนาดถูกต้องใน windows!

ดังนั้นสำหรับแอปที่คุณสามารถเรียกใช้จากไฟล์ bat เช่น: java -jar xxx.jar

ฉันเพิ่งเพิ่ม JAVA_HOME = .... \ java_10 และ PATH =% JAVA_HOME% \ bin;% PATH% ในไฟล์ค้างคาว

java -jar xxx.jar


-2

ฉันลองใช้วิธีแก้ไขปัญหาส่วนใหญ่แล้ว แต่วิธีที่ใช้งานได้สำหรับฉันคือการตั้งค่าโหมดความเข้ากันได้ของระบบในไฟล์ที่ฉันพบในตำแหน่งต่อไปนี้:

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

2
ยินดีต้อนรับสู่ Super User! โปรดอย่าเพิ่ม "ขอบคุณ" หรือ "สิ่งนี้เหมาะกับฉัน" เป็นคำตอบ ลงทุนเวลาในไซต์และคุณจะได้รับสิทธิ์ที่เพียงพอในการถอนคำตอบที่คุณชอบซึ่งเป็นวิธีที่ผู้ใช้ระดับสูงในการพูดขอบคุณ
bertieb

นี่อาจเป็นความเห็นต่อคำตอบของคนอื่น ในการแก้ไขจำเป็นต้องใช้การตั้งค่าความเข้ากันได้กับjava.exeและ / javaw.exeหรือใช้คำแนะนำอื่น ๆ javapathโฟลเดอร์มีการเชื่อมโยงเพื่อ executables ล่าสุด Java ติดตั้งบนระบบ ดังนั้นการใช้การตั้งค่าในProgram Filesควรจะเพียงพอ
Alexey Ivanov

-4

ฉันสามารถรับ dpi ที่สมเหตุสมผลเมื่อรันโดยใช้ command prompt like:

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

นี้ไม่ตอบคำถามจริงๆและมันจะไม่เปลี่ยนแปลงการตั้งค่า DPI สูงของหรือjava.exe javaw.exe
Alexey Ivanov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.