Come impostare il DPI delle app Java Swing su Windows / Linux?

Se hai un monitor con un DPI superiore a 150 (come Macbook Pro), potresti anche trovare il problema: il carattere sull’app Java Swing è troppo piccolo per il monitor DPI alto , e non posso modificare affatto le dimensioni del carattere (It ignora direttamente il DPI di Windows, visualizzando solo DPI molto originale -> 96 ). Non posso fare altro che cambiare la risoluzione dello schermo, che potrebbe assolutamente rendere tutto sfocato sul display LCD.

Sì, ho un portatile con un monitor DPI alto, 15.6 ‘con risoluzione 1920×1080, alcune app desktop Java sembrano molto piccole sul mio portatile, come Matlab, Burpsuite ecc. Sto cercando Internet da molto molto tempo, ma ancora non riesci a trovare un metodo per il problema. So che posso modificare i caratteri JRE tramite JRE_HOME/lib/font/fontconfig.properties.src , ma non riesco a trovare alcun posto dove impostare la dimensione del carattere predefinita o DPI per i caratteri desktop Java.

Il problema non ha soluzione? Hai un monitor DPI alto? Come si fa con tali app? Swing abbandona gli utenti DPI alti?

Attualmente sto esaminando questo problema su Windows. Ecco cosa ho trovato:

La maggior parte di Look & Feels Swing non supporta affatto DPI elevati, nemmeno Nimbus, anche se dovrebbe essere scalabile. Ho trovato alcuni vecchi post del blog che dicevano che Nimbus potrebbe alla fine offrire un ridimensionamento DPI elevato, ma a quanto pare non è mai successo.

L’unica eccezione è System LAF, ma il suo font predefinito è ~ 10% più piccolo delle dimensioni effettive del font di sistema, a tutte le impostazioni DPI. Inoltre, System deve essere selezionato esplicitamente come descritto qui: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Non c’è nemmeno un fattore di scala che potresti impostare in Swing. Il LAF specifico deve fornire il codice per gestire il ridimensionamento. Quindi il meglio che puoi fare è selezionare Sistema e spero che sia abbastanza buono.

Tuttavia, JavaFX funziona correttamente e automaticamente in scala fino al 150% sul mio sistema. Se ansible, ti suggerisco di utilizzare JavaFX per creare la GUI.

modifica: ho creato un paio di piccoli programmi di test e preso screenshot di confronto per vari framework GUI, temi Swing e impostazioni DPI. Questo potrebbe essere informativo per le persone che leggono questa domanda: http://kynosarges.org/GuiDpiScaling.html

Risposta breve: è necessario eseguirlo su JRE 9.

Risposta lunga:
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 correttamente ridimensionate, inclusi i display HiDPI. Ad ogni modo, questo è stato risolto di recente. Vedi il problema JEP 263: HiDPI Graphics su Windows e Linux e l’ 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.

Soluzione: devi eseguirlo su JRE 9 perché supporta veramente questa funzione.

Su Linux , non sembra ansible eseguire il ridimensionamento con qualsiasi aspetto e aspetto di Swing, secondo i miei esperimenti. Tuttavia, è ansible farlo usando un hack che coinvolge VNC, vncdesk . Ecco la mia configurazione per eseguire gradle --gui sotto vncdesk:

.vncdesk/1/settings.ini :

 [desktop] width = 1050 height = 650 [window] title = gradle name = gradle in vncdesk class = GradleInVncdesk scale_factor = 2 

.vncdesk/1/startup :

 #!/bin/sh cd "$INVOCATION_DIR" matchbox-window-manager& exec gradle --gui "[email protected]" 

Sono riuscito a risolverlo seguendo queste istruzioni: Link .

È in tedesco, ma tradurrò le cose importanti.

Crea questa chiave di registro:

 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide] "PreferExternalManifest"=dword:00000001 

Crea un file manifest con questo contenuto:

                        false    

Copialo nella directory bin in cui sono contenuti java.exe e javaw.exe e lo chiami java.exe.manifest e javaw.exe.manifest (Avrai due file con lo stesso contenuto ma nomi diversi).

HTH.

Bernd