¿Cómo ejecuto aplicaciones Java mejoradas en una pantalla de alto DPI?

75

Estoy tratando de ejecutar una aplicación Java (archivo JAR) en una pantalla de alto DPI en Windows 10. La aplicación usa Swing y, por lo tanto, no es compatible con DPI. Normalmente, cuando ejecuto una aplicación que no es compatible con DPI, Windows la escalará por mí, aunque sea borrosa. Pero por alguna razón no está escalando la aplicación Java; Acabo de recibir una pequeña ventana en la esquina con texto imposible de leer. ¿Cómo ejecuto una aplicación Java con la escala de alta DPI (borrosa) de Windows?

Jeff E
fuente
¿Es tu aplicación y controlas las fuentes / objetos, o es una aplicación heredada que ahora no se puede cambiar?
harrymc
3
No es mi aplicación; sin control sobre la fuente.
Jeff E
Malas noticias, es posible que deba reducir su DPI para ejecutar esa aplicación. Aquí hay algunos recursos con hacks que pueden ayudar: Repare fuentes borrosas en Windows 10 , Configuración de DPI en Windows 10 , Windows 10 DPI borroso . Cree al menos una copia de seguridad del punto de restauración del sistema antes de probarlos, por si acaso. La solución alternativa podría ser volver a Windows 7.
harrymc
55
@harrymc ¿Cómo ayudaría cualquiera de los anteriores? El problema no son las fuentes borrosas o que se niega a ejecutarse, el problema es que todo es pequeño . Lo que quiero lograr es la representación de fuentes "borrosas" y, como entendí la pregunta del OP, ellos también lo hacen. Establecer la escala de DPI al 100% haría que todo el sistema sea pequeño; establecer la resolución de la pantalla en una no nativa hará que todo se vea borroso. (Está bien, no es más borroso que en una pantalla de 1080p para mí, pero aún así)
Millimoose
1
@harrymc Y aunque este último puede hacer que la aplicación sea utilizable, estoy seguro de que entiendes por qué respondiendo "¿cómo hago que X funcione en una pantalla de 2160p?" con "usar una pantalla peor" es como perder el punto.
millimoose

Respuestas:

37

El problema aquí parece ser que Swing afirma por defecto que es compatible con DPI, por lo que Windows no lo escala. Use este interruptor para desactivar este comportamiento y Windows comenzará a escalar su aplicación swing:

-Dsun.java2d.dpiaware=false

[EDITAR: Desafortunadamente, este indicador ya no parece funcionar en Java 8, lo estaba probando en Java 6. Parece que este es un problema conocido .]

[EDIT 2: puede modificar una instalación de Java 8 para que funcione correctamente, utilizando un programa para modificar los manifiestos EXE. Cambié la configuración de verdadero a falso en los manifiestos dentro de java.exe y javaw.exe, y ahora mis programas Swing se escalan correctamente en Windows 10 de alta resolución. Solía sintonizador de recursos a este.]

[Editar 3] Solo use Java 9

CarlG
fuente
¿Puedes dar más detalles sobre la edición # 2? ¿Qué configuración modificó exactamente en el manifiesto?
Tomalak
En el XML manifiesto, es el indicador <dpiAware> bajo <asmv3: application> <asmv3: windowsSettings>
CarlG
Ese es el punto. He visto esa bandera y la configuré false, pero la aplicación (JNLP / WebStart) no se ajustó correctamente de ninguna manera. ¿Puedes pensar en una forma simple de verificar si esto funciona o no, por ejemplo, una aplicación de prueba que conoces que responde a esta configuración?
Tomalak
Webstart es particularmente complicado porque puede ser difícil determinar exactamente qué ejecutable en qué distribución de jre has instalado terminas usando. Como verificación cruzada, intentaría iniciar su aplicación directamente con java.exe o javaw.exe y omitir JWS para ver si hay alguna diferencia.
CarlG
44
Esto está en algún lugar entre cómico y farsa. El marco informa erróneamente sus capacidades y se elimina el interruptor que reparó el error. ¿La única solución? Para que los usuarios finales compren una herramienta de terceros. Y la gente se pregunta por qué Java tiene tan mala reputación.
Básico
68

Acabo de encontrar una solución fácil en mi máquina con Windows 10:

  1. Encuentre java.exeinstalado.
  2. Haga clic derecho -> Properties
  3. Ir a la Compatibilitypestaña
  4. Cheque Override high DPI scaling behavior.
  5. Elige SystemparaScaling performed by:
Elderry
fuente
55
La mejor solución: tuve este problema al ejecutar un archivo .jnlp, así que tuve que cambiar el "C: \ Archivos de programa \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" pero funcionó a las mil maravillas.
Dror Harari
Para mí fue la versión JDK. Encontrado haciendo clic derecho y abriendo las opciones del administrador de tareas en Windows 10.
Brian Knoblauch
3
Para Windows 10, que ejecuta lanzadores de Minecraft basados ​​en Java, tuve que cambiar todas las versiones de Java instaladas en mi sistema para que funcione (java.exe y javaw.exe).
cyberbit
55
Usé una variante menos intrusiva. Creé un acceso directo para el comando java -jar myJarFile.jare hice los pasos 2 a 5 en ese acceso directo (Windows 10, Java 8).
Julien Kronegg
1
Para mí, fuejavaw.exe
masterxilo
14

Si tropezó con esta pregunta pero en realidad está buscando una solución que funcione en Linux, esto es para usted.

Si puede agregar parámetros al javabinario que inicia la aplicación, puede usar la opción -Dpara pasar un valor para la sun.java2d.uiScalepropiedad para especificar un factor de escala para Java2D. Esto escalará su aplicación. El valor del factor de escala es un doble. Asegúrese de pasar esta opción al javabinario en sí, no a la aplicación Java iniciada.

Ejemplo: Inicie NearInfinity.jar con un factor de escala de IU de 2.5

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

Este artículo me pareció bastante útil en general para ejecutar Linux en sistemas HiDPI, y algunas de las cosas también podrían funcionar en Windows: https://wiki.archlinux.org/index.php/HiDPI

Christian Hujer
fuente
Esto es bueno, aunque desearía poder obtener una escala de 1 para JFrames y la escala del sistema para JOptionPanes.
Nates
1
No funciona para mi
Atte Juvonen
@AtteJuvonen En lugar de simplemente decir "mi auto no funciona", cuando no funciona para usted, ¿por qué no publica una nueva pregunta que describe lo que ha intentado, cuál fue el resultado esperado, cuál fue el resultado real? resultado, ¿qué línea de comando ha utilizado y qué mensajes de error, si los hay, recibió?
Christian Hujer
@ChristianHujer Intenté iniciar mi aplicación Java Swing con ese parámetro (la misma línea de comando que la de tu respuesta, excepto que la ruta al jar es diferente) y la aplicación se inició sin escalar.
Atte Juvonen
Lo siento si parezco grosero, solo frustrado cuando nada funciona. FWIW Publiqué una nueva pregunta sobre esto y también publicaré una recompensa tan pronto como el sitio me lo permita.
Atte Juvonen
10

Solución: ejecútelo en JRE 9.

Esto se debe a que el tiempo de ejecución de Java se declaró "consciente de DPI", pero realmente no lo admitió para AWT y Swing. Las aplicaciones Java fueron dimensionadas y renderizadas en base a píxeles en lugar de ser escaladas adecuadamente, esto incluía pantallas HiDPI. De todos modos, esto se ha resuelto recientemente. Consulte el problema JEP 263: Gráficos HiDPI en Windows y Linux y la actualización .

Por lo tanto, aumentar el tamaño de fuente no funciona (porque no aumenta el resto de las cosas); el argumento jvm -Dsun.java2d.dpiaware=falseno funciona (porque realmente no es compatible); y el archivo de manifiesto + edición de registro (para Windows) simplemente no funciona.

Luego, debe ejecutarlo en JRE 9 porque realmente admite esta función.

Sergio Muriel
fuente
Estaré realmente emocionado si Java9 soluciona esto.
music2myear
3
Esto no indica que debe volver a compilar el código. Simplemente ejecutar la misma aplicación Java 8- en Java 9+ no cambiará el comportamiento
Ramhound
Ejecutar programas HiDPI en Java 9 resuelve muchos problemas. goo.gl/3zmL7b
Gernot Krost
3
@Ramhound No tiene que volver a compilar. Acabo de construir un frasco con JDK8 para Java 8 que anula el método paint () de JPanel en pantalla completa en un sistema W10 con pantalla 4K y configuración de escala del 200%. Ejecute con el java.exe de Java 8, el objeto Graphics2D dado al método tiene una escala de 1, y el JPanel tiene un getWidth / height de 3840x2160. Ejecute con java.exe de Java 9, la escala es 2 y el ancho / alto es 1920x1080.
Dreamspace President
1
Encontrarás un nuevo método en Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); que realmente funciona (La otra opción es usar el tamaño de pantalla JavaFX, (Screen.getPrimary (). GetVisualBounds ()) que funciona, y dividir esto entre Toolkit.getDefaultToolkit (). GetScreenSize (), encontrará que puede adivinar en el DPI seleccionado: 200% dará como resultado aproximadamente 2.0, pero desafortunadamente 125% todavía da como resultado un porcentaje de escala de 1.0. Sin embargo, incluso después de pasar a Java9: encontré que mis GUI se destruyeron completamente a medida que los botones se expandieron, pero algunas de las constantes (utilizado para huecos, relleno, etc.) no lo hizo
wax_lyrical
4

Para forzar a todos los ejecutables de Java a que tengan "propiedades> compatibilidad> modo de escala de ppp" configurado en "Sistema", en un administrador powershell (win-x, a), ejecute:

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

deshacer:

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

En lugar de HKCU, puede usar HKLM, pero ya no puede cambiar la configuración de escala de ppp manualmente en el cuadro de diálogo de propiedades> compatibilidad de los archivos java * .exe.

masterxilo
fuente
2

Debe configurar PreferExternalManifest en regedit y crear manifiestos personalizados para java.exe y javaw.exe como se indica en la siguiente respuesta stackoverflow https://stackoverflow.com/a/39372897

droidlabel
fuente
3
Buenas noticias, la actualización de Fall Creators le permite cambiar el comportamiento de escala haciendo clic derecho en el elemento, seleccionando propiedades y luego la pestaña de compatibilidad. Ya no es necesario crear un manifiesto externo personalizado, lo cual es bueno.
Richard
0

La solución de Elderry es buena, pero ¿qué sucede si desea ejecutar un archivo jar en Windows y no tiene opciones de compatibilidad?

Vaya a C: \ Archivos de programa (x86) \ Java \ jre \ bin y busque javaw.exe. Haga clic derecho, propiedades, pestaña de compatibilidad, marque "anular el comportamiento de escalado de DPI alto" y seleccione "Sistema" (Tenga en cuenta que "Sistema mejorado" no funcionó para mí).

Ahora las ventanas del archivo jar deberían escalar correctamente con texto legible. De lo contrario, podría significar que Windows no vincula los archivos de tipo jar a javaw.eve como debería. Una solución de terceros está disponible en: https://johann.loefflmann.net/en/software/jarfix/index.html

Kenneth
fuente
0

Prueba Java 10.

Descubrí que -Dsun.java2d.dpiaware = false no funciona en Java 9 o 10. También para Java 8 y 9 mi aplicación swing es pequeña, ¡pero Java 10 se ajusta correctamente en Windows!

así que para una aplicación que puede ejecutar desde un archivo bat como: java -jar xxx.jar

Acabo de agregar JAVA_HOME = .... \ java_10 y PATH =% JAVA_HOME% \ bin;% PATH% en el archivo bat.

java -jar xxx.jar

Stan Towianski
fuente
-2

Probé la mayoría de estas soluciones, pero la que funcionó para mí fue configurar el modo de compatibilidad del sistema en los archivos que encontré en la siguiente ubicación:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
Ryan Reynolds
fuente
2
¡Bienvenido a Super User! No agregue "gracias" o "este funcionó para mí" como respuestas. Invierta algo de tiempo en el sitio y obtendrá los privilegios suficientes para votar las respuestas que le gusten, que es la forma de Súper Usuario de decir gracias.
bertieb
Esto podría ser un comentario sobre la respuesta de otra persona. Para solucionar, es necesario aplicar la configuración de compatibilidad para java.exey / o javaw.exeo utilizar otras recomendaciones. La javapathcarpeta contiene enlaces a los últimos ejecutables de Java instalados en el sistema. Por lo tanto, aplicar la configuración en Program Filesdebería ser suficiente.
Alexey Ivanov
-4

Pude obtener ppp sensibles cuando lo ejecuté usando el símbolo del sistema como:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
usuario3301455
fuente
Esto realmente no responde la pregunta, y no cambia ninguna configuración de DPI alto de java.exeo javaw.exe.
Alexey Ivanov