Come posso eseguire l'app Java upscaled su un display a DPI alto?


63

Sto cercando di eseguire un'app Java (file JAR) su un display a DPI alto su Windows 10. L'app utilizza Swing e quindi non è sensibile ai DPI. Normalmente quando eseguo un'applicazione che non riconosce DPI, Windows la ridimensiona per me, anche se sfocata. Ma per qualche motivo non sta ridimensionando l'app Java; Ho solo una piccola finestrella nell'angolo con un testo impossibile da leggere. Come si esegue un'applicazione Java con il ridimensionamento ad alta DPI (sfocato) di Windows?


È la tua applicazione e controlli i sorgenti / oggetti, o è un'applicazione legacy che è ora immutabile?
harrymc

3
Non è la mia applicazione; nessun controllo sulla fonte.
Jeff E

Cattive notizie, potrebbe essere necessario ridurre il DPI per eseguire tale applicazione. Ecco alcune risorse con hack che potrebbero aiutare: Correggi i caratteri sfocati in Windows 10 , Impostazioni DPI in Windows 10 , Windows 10 DPI sfocato . Creare almeno un backup del punto di ripristino del sistema prima di provarli, per ogni evenienza. La soluzione di fallback potrebbe essere quella di tornare a Windows 7.
harrymc

4
@harrymc In che modo uno dei due può aiutare? Il problema non sono i caratteri sfocati o che si rifiuta di eseguire, il problema è che tutto è minuscolo . Il rendering dei font "sfocato" è ciò che io volere per raggiungere, e come ho capito la domanda del PO, lo fanno anche loro. Impostare il ridimensionamento DPI al 100% renderebbe l'intero sistema minuscolo; l'impostazione della risoluzione dello schermo su quella non nativa renderebbe tutto sfocato. (Va bene, non più sfocato che su un display 1080p per me, ma ancora.)
millimoose

1
@harrymc E mentre quest'ultimo potrebbe rendere l'app utilizzabile, sono sicuro che capisci perché rispondere "come faccio a far funzionare X su un display 2160p?" con "usa un display peggiore" è un po 'come perdere il punto.
millimoose

Risposte:


32

Il problema qui sembra essere che Swing è per impostazione predefinita che afferma che è DPI consapevole, quindi Windows non lo scala. Usa questa opzione per disattivare questo comportamento e Windows inizierà a ridimensionare la tua app di swing:

-Dsun.java2d.dpiaware=false

[EDIT: Sfortunatamente, questo flag non sembra funzionare in Java 8, lo stavo testando in Java 6. Sembra che questo sia un problema conosciuto .]

[MODIFICA 2: è possibile modificare un'installazione di Java 8 per funzionare correttamente, utilizzando un programma per modificare i manifesti EXE. Ho modificato l'impostazione da vero a falso nei manifesti all'interno di java.exe e javaw.exe e ora i miei programmi Swing si ridimensionano correttamente in Windows 10 ad alta risoluzione. ero solito Sintonizzatore di risorse a questo.]

[Modifica 3] Usa solo Java 9


Puoi approfondire la modifica n. 2? Quale impostazione hai modificato nel manifest, esattamente?
Tomalak

Nell'XML manifesto, è il & lt; dpiAware & gt; flag in & lt; asmv3: application & gt; & lt; asmv3: windowsSettings & gt;
CarlG

Questo è il punto. Ho visto quella bandiera e l'ho impostata su false, ma l'applicazione (JNLP / WebStart) non è stata ridimensionata correttamente in entrambi i modi. Riesci a pensare a un modo semplice per verificare se questo funziona o no, ad es. un'app di prova che sai che risponde a questa impostazione?
Tomalak

Webstart è particolarmente schizzinoso perché può essere difficile individuare esattamente quale file eseguibile in cui jre distro hai installato. Come controllo incrociato, proverei a lanciare la tua app direttamente con java.exe o javaw.exe e saltare JWS per vedere se c'è una differenza.
CarlG

4
Questo è qualcosa tra il comico e il farsesco. Il framework riporta erroneamente le sue capacità e l'interruttore che ha corretto l'errore viene rimosso. L'unica soluzione? Per gli utenti finali acquistare uno strumento di terze parti. E la gente si chiede perché Java abbia una reputazione così scarsa.
Basic

54

Ho appena trovato una soluzione facile sulla mia macchina Windows 10:

  1. Trova java.exe hai installato.
  2. Fai clic destro - & gt; Properties
  3. Vai a Compatibility linguetta
  4. Dai un'occhiata Override high DPI scaling behavior.
  5. Scegliere System per Scaling performed by:

4
La soluzione migliore: ho avuto questo problema nell'esecuzione di un file .jnlp, quindi ho dovuto modificare "C: \ Programmi \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" ma questo ha funzionato come un vero e proprio fascino.
Dror Harari

Per me era la versione di JDK. Trovato facendo clic destro e aprendo le opzioni dal task manager in Windows 10.
Brian Knoblauch

3
Per Windows 10, con i lanciatori Minecraft basati su Java, ho dovuto modificare tutte le versioni Java installate sul mio sistema affinché funzionasse (java.exe e javaw.exe).
cyberbit

5
Ho usato una variante meno invadente. Ho creato una scorciatoia per il comando java -jar myJarFile.jar e ha eseguito i passaggi da 2 a 5 su tale scorciatoia (Windows 10, Java 8).
Julien Kronegg

1
Per me, lo era javaw.exe
masterxilo

10

Se ti sei imbattuto in questa domanda ma in realtà stai cercando una soluzione che funzioni su Linux, questo è per te.

Se è possibile aggiungere parametri al java binario che avvia l'applicazione, è possibile utilizzare l'opzione -D passare un valore per il sun.java2d.uiScale proprietà per specificare un fattore di scala per Java2D. Questo ridimensionerà la tua applicazione. Il valore del fattore di scala è un doppio. Assicurati di passare questa opzione a java binario stesso, non l'applicazione Java lanciata.

Esempio: avvia NearInfinity.jar con un fattore di ridimensionamento dell'interfaccia utente di 2,5

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

Ho trovato questo articolo abbastanza utile in generale per l'esecuzione di Linux su sistemi HiDPI, e alcune cose potrebbero funzionare anche su Windows: https://wiki.archlinux.org/index.php/HiDPI


Questo è buono, anche se mi piacerebbe ottenere un ridimensionamento di 1 per JFrames e il ridimensionamento del sistema per JOptionPanes.
NateS

1
Non funziona per me.
Atte Juvonen

@AtteJuvonen Invece di dire "la mia macchina non funziona", quando non funziona per te, perché non inserisci una nuova domanda che descrive ciò che hai provato, quale era il risultato atteso, qual era l'effettiva risultato, quale riga di comando hai usato e quali messaggi di errore hai ricevuto?
Christian Hujer

@ChristianHujer Ho provato a lanciare la mia app Java Swing con quel parametro (stessa riga di comando di quella nella tua risposta, eccetto il percorso per jar è diverso) e l'app è stata lanciata senza ridimensionamento.
Atte Juvonen

Scusate se sembro scortese, semplicemente frustrato quando niente funziona. FWIW Ho postato una nuova domanda su questo e invierò anche una bounty su di esso non appena il sito mi permetterà.
Atte Juvonen

9

Soluzione: eseguilo su JRE 9.

Questo perché il runtime Java si è dichiarato "DPI-aware", ma in realtà non lo supportava per AWT e Swing. Le applicazioni Java sono state ridimensionate e renderizzate in base ai pixel anziché essere adeguatamente ridimensionate, inclusi gli schermi HiDPI. Ad ogni modo, questo è stato risolto di recente. Vedi il problema JEP 263: HiDPI Graphics su Windows e Linux e il aggiornamento .

Quindi, aumentando la dimensione del carattere non funziona (perché non aumenta il resto delle cose); l'argomento jvm -Dsun.java2d.dpiaware=false non funziona (perché non è realmente supportato); e il file manifest + modifica del registro (per Windows) non funziona.

Quindi, è necessario eseguirlo su JRE 9 perché supporta davvero questa funzione.


Sarò davvero entusiasta se Java9 risolve questo problema.
music2myear

3
Questo non indica che devi ricompilare il codice. La semplice esecuzione della stessa applicazione Java 8 su Java 9+ non cambierà il comportamento
Ramhound

Esecuzione di programmi HiDPI su soluzioni Java 9 Un sacco di problemi. goo.gl/3zmL7b
Gernot Krost

3
@Ramhound Non devi ricompilare. Ho appena creato un jar con JDK8 per Java 8 che sovrascrive il metodo paint () di JPanel su un sistema W10 con schermo 4K e impostazione di scala del 200%. Eseguito con java.exe di Java 8, l'oggetto Graphics2D assegnato al metodo ha un ridimensionamento di 1 e JPanel ha un getWidth / height di 3840x2160. Esegui con java.exe di Java 9, il ridimensionamento è 2 e la larghezza / altezza è 1920x1080.
Dreamspace President

1
Troverai un nuovo metodo in Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); che in realtà funziona. (L'altra opzione è usare la dimensione dello schermo JavaFX, (Screen.getPrimary (). GetVisualBounds ()) che funziona, e dividerlo con Toolkit.getDefaultToolkit (). GetScreenSize (), Scoprirai che puoi ottenere un'ipotesi al DPI selezionato: 200% si tradurrà in circa 2,0, ma sfortunatamente il 125% continua a mostrare una percentuale di scalatura di 1,0 Tuttavia, anche dopo il passaggio a Java9: ho trovato le mie GUI completamente distrutte man mano che i pulsanti si espandevano, ma alcune delle costanti (usato per spazi vuoti, imbottiture ecc.) no.
wax_lyrical

2

È necessario impostare PreferExternalManifest in regedit e creare manifesti personalizzati per java.exe e javaw.exe come indicato nella seguente risposta StackOverflow https://stackoverflow.com/a/39372897


2
Buone notizie, l'aggiornamento Autori creativi ti consente di modificare il comportamento del ridimensionamento facendo clic con il pulsante destro del mouse sull'elemento, selezionando Proprietà e quindi la scheda Compatibilità. Non è più necessario creare un manifest esterno personalizzato, il che è bello.
Richard

2

Per forzare tutti gli eseguibili java ad avere "proprietà & gt; compatibilità & gt; dpi ridimensionamento modalità" impostato su "Sistema", in un amministratore powershell (win-x, a), eseguire:

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

annullare:

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

Invece di HKCU potresti usare HKLM, ma non puoi più modificare manualmente l'impostazione di ridimensionamento dpi nelle proprietà & gt; finestra di dialogo di compatibilità dei file java * .exe.


2

Grazie per Kenneth. io trovo C:\Program Files (x86)\Java\jre\bin\java.exe poi right click -> properties -> compatibility tab -> "override high DPI scaling behavior" e selezionare System, quindi funziona. Ho anche provato lo stesso modo per cambiare il javaw.exe La compatibilità, funziona anche.

PS: corro burpsuite.jar su win10 1703 usando questo metodo.


0

La soluzione di Elderry è buona, ma cosa succede se si desidera eseguire un file jar su Windows e non ha opzioni di compatibilità?

Vai a C: \ Programmi (x86) \ Java \ jre \ bin e trova javaw.exe. Fare clic con il tasto destro, proprietà, scheda compatibilità, selezionare "sovrascrivi il comportamento di ridimensionamento DPI alto" e selezionare "Sistema" (nota che "Sistema avanzato" non ha funzionato per me).

Ora le finestre dei file jar dovrebbero essere ridimensionate correttamente con testo leggibile. In caso contrario, potrebbe significare che Windows non collega i file di tipo jar a javaw.eve come dovrebbe. Una correzione di terze parti è disponibile all'indirizzo: https://johann.loefflmann.net/en/software/jarfix/index.html


0

Prova Java 10.

Ho scoperto che -Dsun.java2d.dpiaware = false non funziona in Java 9 o 10. Anche per Java 8 e 9 la mia app swing è piccola, ma le dimensioni di Java 10 sono corrette in Windows!

quindi per un'app che puoi eseguire da un file bat come: java-jar xxx.jar

Ho appena aggiunto JAVA_HOME = .... \ java_10 e PATH =% JAVA_HOME% \ bin;% PATH% nel file bat.

java-jar xxx.jar


-1

Ho provato la maggior parte di queste soluzioni, ma quella che ha funzionato per me era impostare la modalità di compatibilità di sistema sui file che ho trovato nel seguente percorso:

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

1
Benvenuto in Super User! Per favore non aggiungere "grazie" o "questo ha funzionato per me" come risposta. Investi qualche tempo nel sito e ne guadagnerai abbastanza privilegi per sviare le risposte che ti piacciono, che è il modo di dire Super User grazie.
bertieb

-3

Sono stato in grado di ottenere dpi sensati quando eseguito utilizzando il prompt dei comandi come:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.