Java - Paradojas con las Dimensiones de las Ventanas

 
Vista:
sin imagen de perfil
Val: 23
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Paradojas con las Dimensiones de las Ventanas

Publicado por Paco (11 intervenciones) el 17/10/2019 20:43:21
Hola, a ver si alguien puede ayudarme con esto, pues es realmente extraño y veo que no avanzo. Tengo Windows 10 con una pantalla configurada a 3840x2160 (4K).

Os muestro un sencillísimo programa, reducido a la mínima expresión, en el que solo hay un Jframe. El código no es mío, lo ha hecho WindowBuilder desde Eclipse. Yo solo he hecho dos cambios, además de limpiarle los comentarios:
- He cambiado los valores de SetBounds a 0,0,1300,700.
- He añadido la línea de setMinimumSize a 1200,600

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package pck;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
 
public class Main extends JFrame {
	private static final long serialVersionUID = 1L;
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	public Main() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(0, 0, 1300, 700);
		this.setMinimumSize(new Dimension(1200,600));
	}
}

Supuestamente, el ejecutar, aparecerá una ventana, y podré disminuirla de tamaño un poco. Pues no. Esto es lo que me pasa (os muestro siempre copys de la pantalla completa):

1.-Tamaño al ejecutar (ver imagen 1). Debería haber salido mucho más pequeño, pues ¿qué son 1300x700 frente a los 3840x2160 de mi pantalla?. Pero resulta que según la clase Toolkit de Java las dimensiones de mi pantalla no son esas, sino 1536x864. Primera paradoja. Bueno, asumamos que las dimensiones máximas son las que dice la clase Toolkit: hemos pintado un rectángulo 1300x700 dentro de otro 1536x864. (por cierto, vemos que no empieza en el punto 0,0 de la pantalla: Segunda paradoja) Y vamos al paso 2:

2.-Ahora voy a reducir el tamaño al máximo. Debería dejarme reducir poco, pero para mi sorpresa me deja reducir mucho (ver imagen 2). Tercera paradoja: He reducido a 1200x600. Pero no en "pixeles de la clase toolkit", sino esta vez en "pixeles reales", pues lo que estoy viendo en proporción es un rectángulo 1200x600 dentro de otro 3840x2160. Y claro, después de ver esto me doy cuenta de que puedo poner barbaridades como esta:

1
2
setBounds(0, 0, 1300, 700);
this.setMinimumSize(new Dimension(1400,800));

...es decir, un tamaño mínimo numéricamente mayor, pero el resultado es que puedo reducir, y mucho, la ventana. Con esto lo que hace es iniciar con 1400,800 vs1536x864. Y me deja disminuir a 1400,800 vs 3840x2160, que proporcionalmente es mucho más pequeño. No os pego más pantallazos por no abultar más el mensaje.

Por favor, necesito que alguien que sepa lo que está sucediendo me lo explique. Yo lo que quiero es que los métodos setBounds y setMinimumSize hablen el mismo idioma. Mi objetivo en realidad es aprovechar toda la resolución "real": que pueda hacer un setBounds(0,0,3840,2160) sin que se me salga de la pantalla, pero Java no solo la reduce, sino que se contradice a sí mismo...

Ahora mismo tengo OpenJDK 11, pero lo he probado con Java 8, Java 9...siempre me sucede lo mismo.

Imagen 1. Tamaño inicial

Paradoja1

Imagen 2. Tamaño final, después de reducir al máximo


Paradoja2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Paradojas con las Dimensiones de las Ventanas

Publicado por Tom (1831 intervenciones) el 18/10/2019 09:35:18
Prueba, con java11:

1.- No uses setBounds en el frame. Tienes setPreferredSize() o setSize() si no recuerdo mal. Como dice la documentación, setBounds recoloca un componente en su layout. Un Jframe no está en ningún layout.

2.- Revisa la configuración de windows:
https://www.eizoglobal.com/support/compatibility/dpi_scaling_settings_windows/

3.- Prueba con estos parámetros al ejecutar tus pruebas:
https://news.kynosarges.org/2019/03/24/swing-high-dpi-properties/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Paradojas con las Dimensiones de las Ventanas

Publicado por Paco (11 intervenciones) el 20/10/2019 00:30:05
Hola Tom,
muchas gracias por tu respuesta.

Respecto a setBounds, como he comentado, no lo he utilizado yo. Forma parte del código escrito por WindowBuilder al crear el JFrame. Yo lo único que he hecho es cambiarle los valores. No entiendo bien por qué no puedo usar este método. Según la documentación, aunque no sea un método de esta clase, lo es de la clase Windows, de la cual está heredado. No obstante he probado con las otras alternativas que comentas, pero obtengo el mismo resultado.

Respecto a la configuración de Windows, es cierto que lo tengo configurado con una escala para hacer más grande el texto, y que si disminuyo el valor de esta escala, aumentan las dimensiones máximas en pixels que me ofrece la clase Toolkit. Pero ese cambio de configuración afecta obviamente a todas las aplicaciones, y la letra se hace diminuta, por no decir microscópica. Esto no siempre ha sido así. Antes, yo tenía la misma configuración de windows que ahora, podía ver la letra grande, y esto no impedía que pudiese manejar desde Java ventanas 2160p. En algún momento -ya no puedo estar seguro de si por un cambio de versión de Java o quizás por alguna actualización de Windows- esto ha dejado de ser posible y de hecho aplicaciones hechas por mí hace tiempo que se ajustaban a la pantalla, ahora se ven enormes superando los límites de la misma.

Me queda probar el tercer punto que comentas, pero no sé como hacerlo. Por lo que leo entiendo que lo siguiente es una opción de la máquina virtual:
1
-Dsun.java2d.uiScale.enabled=false
Me gustaría probarlo, pero no sé cómo hacerlo. No sé si metiéndolo en el apartado -vmargs de Eclipse...lo he probado sin éxito. Directamente en el jre del OpenJDK que tengo no sé cómo se hace. Mis conocimientos de Java no llegan a tanto.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Paradojas con las Dimensiones de las Ventanas

Publicado por Ever (2 intervenciones) el 21/10/2019 18:24:32
Para colocar el argumento a la hora de ejecutar tu programa
Haz click derecho en tu proyecto
--Selecciona Run As
---Run configurations...
----Seleccionas la pestaña Arguments
----- y en el campo vm arguments se coloca el argumento para que puedas correr tu programa y hacer la prueba.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Paradojas con las Dimensiones de las Ventanas

Publicado por Paco (11 intervenciones) el 21/10/2019 20:21:35
Muchas gracias Ever,
he podido ejecutar sin problema aplicando el argumento. Gracias a esto se ha eliminado el escalado que hacía Java para este proyecto en particular, de forma que ahora sí, las dimensiones máximas en pixels que me ofrece la clase Toolkit son 3840x2160. Tengo que hacer ajustes en los proyectos antiguos porque los tamaños de letra se vuelven diminutos, pero es un gran paso, esto me abre más posibilidades de cara a nuevos proyectos en los que quiera aprovechar toda la resolución de la pantalla.
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar