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
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:
...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

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

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

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

Valora esta pregunta


0