Làm cách nào để chạy các ứng dụng Java được nâng cấp trên màn hình DPI cao?


75

Tôi đang cố chạy một ứng dụng Java (tệp JAR) trên màn hình DPI cao trên Windows 10. Ứng dụng sử dụng Swing và do đó không nhận biết DPI. Thông thường khi tôi chạy một ứng dụng không nhận biết DPI, Windows sẽ mở rộng quy mô cho tôi, mặc dù mờ. Nhưng vì một số lý do, nó không mở rộng ứng dụng Java; Tôi chỉ nhận được một cửa sổ nhỏ ở góc với văn bản không thể đọc được. Làm cách nào để chạy ứng dụng Java với tỷ lệ DPI (mờ) cao của Windows?


Đây có phải là ứng dụng của bạn và bạn có kiểm soát các nguồn / đối tượng không, hay đây là một ứng dụng cũ không thể thay đổi?
harrymc

3
Đây không phải là ứng dụng của tôi; không kiểm soát nguồn.
Jeff E

Tin xấu, bạn có thể cần phải hạ DPI để chạy ứng dụng đó. Dưới đây là một số tài nguyên với các bản hack có thể giúp: Khắc phục các phông chữ mờ trong Windows 10 , Cài đặt DPI trong Windows 10 , Windows 10 DPI bị mờ . Tạo ít nhất một bản sao lưu điểm khôi phục hệ thống trước khi dùng thử, chỉ trong trường hợp. Giải pháp dự phòng có thể là quay trở lại Windows 7.
harrymc

5
@harrymc Làm thế nào để giúp một trong những điều trên? Vấn đề không phải là phông chữ mờ hoặc nó không chịu chạy, vấn đề là mọi thứ đều nhỏ bé . Kết xuất phông chữ "mờ" là những gì tôi muốn đạt được và khi tôi hiểu câu hỏi của OP, họ cũng làm như vậy. Đặt tỷ lệ DPI thành 100% sẽ làm cho toàn bộ hệ thống trở nên nhỏ bé; đặt độ phân giải màn hình thành không phải bản địa sẽ khiến mọi thứ trông mờ đi. (Được rồi, không có mờ hơn trên màn hình 1080p đối với tôi, nhưng vẫn vậy.)
millimoose

1
@harrymc Và trong khi ứng dụng sau có thể làm cho ứng dụng có thể sử dụng được, tôi chắc chắn bạn hiểu tại sao trả lời "làm cách nào để X hoạt động trên màn hình 2160p?" với "sử dụng màn hình tệ hơn" là loại thiếu điểm.
millimoose

Câu trả lời:


37

Vấn đề ở đây dường như là Swing mặc định tuyên bố rằng đó là nhận thức của DPI, vì vậy các cửa sổ không mở rộng quy mô. Sử dụng công tắc này để tắt hành vi này và các cửa sổ sẽ bắt đầu mở rộng ứng dụng swing của bạn:

-Dsun.java2d.dpiaware=false

[EDIT: Thật không may, cờ này dường như không còn hoạt động trong Java 8, tôi đã thử nghiệm nó trong Java 6. Có vẻ như đây là một vấn đề đã biết .]

[EDIT 2: Bạn có thể sửa đổi cài đặt Java 8 để hoạt động chính xác, sử dụng chương trình để sửa đổi các bảng kê khai EXE. Tôi đã thay đổi cài đặt từ true thành false trong các bảng kê khai bên trong java.exe và javaw.exe, và bây giờ các chương trình Swing của tôi có tỷ lệ chính xác trong Windows 10 dpi cao. Tôi đã sử dụng Resource Tuner cho việc này.]

[Chỉnh sửa 3] Chỉ cần sử dụng Java 9


Bạn có thể giải thích về chỉnh sửa # 2 không? Chính xác thì cài đặt nào bạn đã sửa đổi trong bảng kê khai?
Tomalak

Trong Manifest XML, đó là cờ <dpiAware> bên dưới <asmv3: application> <asmv3: windowsSinstall>
CarlG

Đó là điểm. Tôi đã nhìn thấy lá cờ đó và tôi đã đặt nó false, nhưng ứng dụng (JNLP / WebStart) đã không mở rộng đúng cách. Bạn có thể nghĩ ra một cách đơn giản để kiểm tra chéo xem điều này có hoạt động hay không, ví dụ như một ứng dụng thử nghiệm mà bạn biết có đáp ứng với cài đặt này không?
Tomalak

Webstart đặc biệt khó khăn vì khó có thể xác định chính xác chương trình thực thi nào mà bạn đã cài đặt mà bạn đã cài đặt. Để kiểm tra chéo, tôi sẽ thử khởi chạy ứng dụng của bạn trực tiếp với java.exe hoặc javaw.exe và bỏ qua JWS để xem có sự khác biệt nào không.
CarlG

4
Đây là một nơi nào đó giữa hài hước và xa vời. Khung báo cáo sai khả năng của nó và công tắc đã sửa lỗi được loại bỏ. Công việc duy nhất xung quanh? Đối với người dùng cuối để mua một công cụ của bên thứ 3. Và mọi người tự hỏi tại sao Java lại có tiếng xấu như vậy.
Cơ bản

68

Chỉ cần tìm một giải pháp dễ dàng trên máy Windows 10 của tôi:

  1. Tìm java.exebạn đã cài đặt.
  2. Nhấp chuột phải -> Properties
  3. Chuyển đến Compatibilitytab
  4. Kiểm tra Override high DPI scaling behavior.
  5. Chọn SystemchoScaling performed by:

5
Giải pháp tốt nhất - Tôi gặp vấn đề này khi chạy tệp .jnlp vì vậy tôi đã phải thay đổi "C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" nhưng điều này hoạt động như bùa mê.
Dror Harari

Đối với tôi đó là phiên bản JDK. Tìm thấy bằng cách nhấp chuột phải và mở các tùy chọn từ trình quản lý tác vụ trong Windows 10.
Brian Knoblauch

3
Đối với Windows 10, chạy các trình khởi chạy Minecraft dựa trên Java, tôi đã phải thay đổi tất cả các phiên bản Java đã cài đặt trên hệ thống của mình để nó hoạt động (java.exe và javaw.exe).
gian mạng

5
Tôi đã sử dụng một biến thể ít xâm nhập hơn. Tôi đã tạo một lối tắt cho lệnh java -jar myJarFile.jarvà thực hiện các bước từ 2 đến 5 trên phím tắt đó (Windows 10, Java 8).
Julien Kronegg

1
Đối với tôi, đó làjavaw.exe
masterxilo

14

Nếu bạn vấp phải câu hỏi này nhưng thực sự đang tìm kiếm một giải pháp hoạt động trên Linux, thì đây là dành cho bạn.

Nếu bạn có thể thêm tham số vào javatệp nhị phân khởi chạy ứng dụng, bạn có thể sử dụng tùy chọn -Dđể truyền giá trị cho sun.java2d.uiScaleproprty để chỉ định hệ số tỷ lệ cho Java2D. Điều này sẽ mở rộng ứng dụng của bạn. Giá trị hệ số tỷ lệ là gấp đôi. Hãy chắc chắn rằng bạn chuyển tùy chọn này cho javachính nhị phân, chứ không phải ứng dụng Java đã khởi chạy.

Ví dụ: Khởi chạy NearInfinity.jar với hệ số tỷ lệ UI là 2,5

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

Tôi thấy bài viết này khá hữu ích để chạy Linux trên các hệ thống HiDPI và một số thứ có thể hoạt động trên Windows: https://wiki.archlinux.org/index.php/HiDPI


Điều này là tốt, mặc dù tôi ước tôi có thể lấy tỷ lệ 1 cho JFrames và nhân rộng hệ thống cho JOptionPanes.
NateS

1
Không làm việc cho tôi.
Atte Juvonen

@AtteJuvonen Thay vì chỉ nói "xe của tôi không hoạt động", khi nó không hiệu quả với bạn, tại sao bạn không đăng một câu hỏi mới mô tả những gì bạn đã thử, kết quả mong đợi, thực tế là gì kết quả, dòng lệnh nào bạn đã sử dụng và thông báo lỗi bạn nhận được là gì?
Christian Hujer

@ChristianHujer Tôi đã thử khởi chạy ứng dụng Java Swing của mình với tham số đó (cùng dòng lệnh với câu trả lời của bạn, ngoại trừ đường dẫn đến jar là khác nhau) và ứng dụng đã được khởi chạy mà không mở rộng.
Atte Juvonen

Xin lỗi nếu tôi có vẻ thô lỗ, chỉ thất vọng khi không có gì hoạt động. FWIW Tôi đã đăng một câu hỏi mới về điều này và tôi cũng sẽ đăng một tiền thưởng trên đó ngay khi trang web cho phép tôi.
Atte Juvonen

10

Giải pháp: Chạy nó trên JRE 9.

Điều này là do thời gian chạy Java tự tuyên bố là "nhận biết DPI" nhưng không thực sự hỗ trợ nó cho AWT và Swing. Các ứng dụng Java có kích thước và được hiển thị dựa trên pixel thay vì được chia tỷ lệ chính xác, điều này bao gồm các màn hình HiDPI. Dù sao, điều này đã được giải quyết gần đây. Xem vấn đề JEP 263: HiDPI Graphics trên Windows và Linux và bản nâng cấp .

Vì vậy, tăng kích thước phông chữ không hoạt động (vì nó không làm tăng phần còn lại của mọi thứ); đối số jvm -Dsun.java2d.dpiaware=falsekhông hoạt động (vì nó không thực sự được hỗ trợ); và tệp kê khai + chỉnh sửa sổ đăng ký (cho Windows) không hoạt động.

Sau đó, bạn cần chạy nó trên JRE 9 vì nó thực sự hỗ trợ tính năng này.


Tôi sẽ rất phấn khích nếu Java9 sửa lỗi này.
music2myear

3
Điều này không chỉ ra rằng bạn phải biên dịch lại mã. Chỉ cần chạy cùng một ứng dụng Java 8- trên Java 9+ sẽ không thay đổi hành vi
Ramhound

Chạy các chương trình HiDPI trên Java 9 giải quyết được rất nhiều vấn đề. goo.gl/3zmL7b
Gernot Krost

3
@Ramhound Bạn không phải biên dịch lại. Tôi vừa xây dựng một jar với JDK8 cho Java 8, ghi đè phương thức paint () toàn màn hình của JPanel trên hệ thống W10 với màn hình 4K và cài đặt tỷ lệ 200%. Chạy với java.exe của Java 8, đối tượng Graphics2D được cung cấp cho phương thức có tỷ lệ 1 và JPanel có getWidth / height là 3840x2160. Chạy với java.exe của Java 9, tỷ lệ là 2 và chiều rộng / chiều cao là 1920x1080.
Chủ tịch Dreamspace

1
Bạn sẽ tìm thấy một phương thức mới trong Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); mà thực sự làm việc (Tùy chọn khác là sử dụng kích thước màn hình JavaFX, (Screen.getPrimary (). GetVisualBound ()) hoạt động và chia phần này cho Toolkit.getDefaultToolkit (). GetScreenSize () tại DPI được chọn: 200% sẽ có kết quả khoảng 2.0, nhưng thật không may, 125% vẫn dẫn đến tỷ lệ phần trăm 1.0. Tuy nhiên, ngay cả sau khi chuyển sang Java9: Tôi thấy GUI của mình bị phá hủy hoàn toàn khi các nút được mở rộng, nhưng một số hằng số (được sử dụng cho các khoảng trống, phần đệm, v.v.) không.
wax_lyument

4

Để buộc tất cả các tệp thực thi java phải có "thuộc tính> tương thích> chế độ chia tỷ lệ dpi" được đặt thành "Hệ thống", trong quyền hạn của quản trị viên (win-x, a), hãy chạy:

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

trở lại:

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

Thay vì HKCU, bạn có thể sử dụng HKLM, nhưng sau đó bạn không thể thay đổi cài đặt tỷ lệ dpi theo cách thủ công nữa trong hộp thoại tương thích> thuộc tính của các tệp java * .exe.


2

Bạn cần đặt PreferExternalManifest trong regedit và tạo các bảng kê khai tùy chỉnh cho java.exe và javaw.exe như được đưa ra trong câu trả lời stackoverflow https://stackoverflow.com/a/39372897


3
Tin vui, bản cập nhật Fall Creators cho phép bạn thay đổi hành vi mở rộng bằng cách nhấp chuột phải vào mục, chọn thuộc tính và sau đó là tab tương thích. Tạo một bảng kê khai bên ngoài tùy chỉnh không còn cần thiết nữa - điều này thật tuyệt.
Richard

0

Giải pháp của Elderry là tốt, nhưng nếu bạn muốn chạy tệp jar trên Windows và nó không có tùy chọn tương thích thì sao?

Truy cập C: \ Program Files (x86) \ Java \ jre \ bin và tìm javaw.exe. Nhấp chuột phải, thuộc tính, tab tương thích, kiểm tra "ghi đè hành vi tỷ lệ DPI cao" và chọn "Hệ thống" (Lưu ý rằng "Hệ thống nâng cao" không hoạt động đối với tôi).

Bây giờ các cửa sổ tệp jar nên chia tỷ lệ đúng với văn bản có thể đọc được. Nếu không, điều đó có nghĩa là Windows không liên kết các tệp kiểu jar với javaw.eve như mong muốn. Bản sửa lỗi của bên thứ ba có sẵn tại: https://johann.loefflmann.net/en/software/jarfix/index.html


0

Hãy thử Java 10.

Tôi thấy rằng -Dsun.java2d.dpiaware = false không hoạt động trong Java 9 hoặc 10. Ngoài ra, đối với Java 8 và 9, ứng dụng swing của tôi nhỏ, nhưng kích thước Java 10 đúng trong các cửa sổ!

vì vậy, đối với một ứng dụng mà bạn có thể chạy từ tệp bat như: java -jar xxx.jar

Tôi vừa thêm JAVA_HOME = .... \ java_10 và PATH =% JAVA_HOME% \ bin;% PATH% trong tệp bat.

java -jar xxx.jar


-2

Tôi đã thử hầu hết các giải pháp này, nhưng giải pháp phù hợp với tôi là cài đặt chế độ tương thích hệ thống trên các tệp tôi tìm thấy ở vị trí sau:

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

2
Chào mừng bạn đến với Siêu người dùng! Vui lòng không thêm "cảm ơn" hoặc "điều này có hiệu quả với tôi" làm câu trả lời. Đầu tư một chút thời gian vào trang web và bạn sẽ có đủ đặc quyền để nâng cao câu trả lời bạn thích, đó là cách nói siêu cảm ơn của bạn.
bertieb

Đây có thể là một nhận xét về câu trả lời của người khác. Để khắc phục, cần phải áp dụng các cài đặt tương thích cho java.exevà / javaw.exehoặc sử dụng các đề xuất khác. Các javapaththư mục chứa các liên kết để thực thi Java mới nhất được cài đặt trên hệ thống. Do đó, áp dụng các thiết lập trong Program Fileslà đủ.
Alexey Ivanov

-4

Tôi đã có thể nhận được dpi hợp lý khi chạy bằng dấu nhắc lệnh như:

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

Điều này thực sự không trả lời câu hỏi và nó không thay đổi bất kỳ cài đặt DPI cao nào của java.exehoặc javaw.exe.
Alexey Ivanov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.