¿Cuál es la diferencia entre getWidth () / getHeight (), y getPreferredSize (). Anchura / altura?

Eitanos30:

Estoy tratando de pintar un teclado con teclas que se reajuste dinámico cuando se cambia el tamaño de JFrame. Además, las teclas pueden estar en diferentes tamaños.

Tengo un panel que tiene su diseño conjunto a BorderLayout. En el centro puse un panel que tiene su diseño conjunto a GridLayout(5,1).

Cada fila de la cuadrícula es una JPanelcon FlowLayout. En cada una de las filas que estoy calculando cada botón y establecer su tamaño preferido mediante una llamada al setPreferredSizemétodo.

Cuando se ejecuta el programa que veo sólo algunos botones de un aspecto extraño. Cuando estoy comprobando los paneles fila con getWidth()/getHeight()y con getPreferredSize().width/height, estoy consiguiendo valores diferentes: Para getPrefereedSize().width, estoy recibiendo el ancho que realmente set, pero por getWidth()que estoy recibiendo un valor significativamente más bajo.

¿Hay alguna diferencia entre ambos métodos, getWidth()y getPreferredSize().width?

Marco13:

(Hay una contrapartida de esta pregunta: Java: Diferencia entre el setPreferredSize () y setSize () de componentes . Y hay algunas otras preguntas con respecto getSize()y getPreferredSize(), pero que no encontrar uno que podría ser considerado como un duplicado tanto. aquí vamos...)

Un componente en oscilación por lo general tiene un tamaño preferido . Este es el tamaño que se devuelve al llamar al getPreferredSizemétodo. Es el tamaño que el componente sería "así como" tener, con el fin de visualizar correctamente. Por ejemplo, una JLabelcon un cierto texto y la fuente tendrá un tamaño preferido que es suficiente grande para mostrar todo el texto.

Pero cuando un componente se visualiza en la pantalla, a continuación, puede que no sea posible demostrar que con su preferido tamaño (algunos motivos se explicarán más adelante). Así que cuando se llama getSize, el método devolverá el real tamaño que el componente actualmente tiene en la pantalla. Cuando se cambia el tamaño de la trama que contiene, a continuación, el componente puede también cambiar de tamaño, y luego devuelve un valor diferente de nuevo.

(Tenga en cuenta que getSize(), básicamente, devuelve un único objeto que contiene los mismos valores que los devueltos por getWidth()y getHeight()).


¿Por qué no siempre es posible asegurarse de que el real tamaño coincide con el preferido tamaño:

La disposición de oscilación suele ser manejado por los controladores de distribución. Los detalles se explican en el tutorial sobre Tendido de componentes dentro de un contenedor , pero voy a tratar de resumir la parte que es relevante para esta pregunta aquí.

Tal controlador de distribución se trate para diseñar componentes con su tamaño preferido. Uno puede imaginar que esto es difícil, ya veces imposible. Imagine un panel con una GridLayout(1,2)que contiene otros dos paneles:

+---------------------+---------------------+
|                     |                     |
|  Preferred Size:    |   Preferred Size    |
|     400 x 300       |      100 x 200      |
|                     |                     |
+---------------------+---------------------+

En el GridLayout, todos los componentes deben tener el mismo tamaño. Pero sus preferidos tamaños son diferentes. Por lo que el controlador de distribución simplemente no puede asegurarse de que las reales dimensiones de los paneles son los mismos que sus preferidos tamaños. Por lo que los muestra con un tamaño que es un compromiso entre los dos. (También puede tener en cuenta el tamaño mínimo y máximo, lo que hace aún más difícil ...). Al final, el tamaño de ambos paneles puede ser, por ejemplo, ser (300.200) píxeles, aunque los tamaños preferidas han sido (400,300) y (100.200) píxeles.


Específicamente en relación con el diseño que usted describió: Tenga en cuenta que FlowLayoutes un poco especial aquí. Se expondrán los componentes con su tamaño preferido, si hay suficiente espacio. Si hay no suficiente espacio, a continuación, algunos componentes pueden no ser visibles. Por lo que podría intentar cambiar el FlowLayouten sus filas a ser una GridLayout(1,n), donde nes el número de llaves en esta fila.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=335199&siteId=1
Recomendado
Clasificación