2010-04-01 16 views
6

Estoy usando Swing GroupLayout y estoy confundido acerca de los valores GroupLayout.DEFAULT_SIZE y GroupLayout.PREFERRED_SIZE. Nunca sé cuándo usar cada uno de ellos en métodos como GroupLayout.addComponent(Component, int, int, int).¿cuál es la diferencia entre DEFAULT_SIZE y PREFERRED_SIZE?

supongamos que tengo este código:

GroupLayout l = ...; 

l.setHorizontalGroup(l.createSequentialGroup() 
    .addComponent(tf1) 
    .addComponent(tf2)); 

l.setVerticalGroup(l.createParallelGroup() 
    .addComponent(tf1) 
    .addComponent(tf2)); 

hay dos JTextField s en una sola línea distribuida con GroupLayout (un grupo secuencial en horizontal y en un grupo paralelo verticalmente). si cambio el tamaño de la ventana ahora, ambos componentes obtienen el espacio disponible (50% cada uno). pero solo quiero que el primer campo de texto crezca/disminuya horizontalmente y que solo el segundo campo de texto crezca o se encoja verticalmente. ¿Qué valores de min, pref y máximo debo usar para lograr eso? Sé que puedo probarlo y ver qué combinación funciona, pero me gustaría saber el razonamiento detrás de este problema.

+0

Básicamente GroupLayout está diseñado para ser utilizado en los editores de interfaz de usuario WYSIWYG (como en Netbeans). ¿Preguntas por curiosidad o la usas "a mano"? – pajton

+1

ambos :-) Utilizo el editor WYSIWYG de NetBeans pero me gusta entender el código para poder implementar algunos casos simples 'a mano'. Tengo más control del código cuando lo hago yo mismo. – cd1

Respuesta

3

Se pueden encontrar algunas pautas en How to Use GroupLayout: Component Size and Resizability. En cuanto a DEFAULT_SIZE y PREFERRED_SIZE,

Se pueden utilizar como parámetros en el método

addComponent(Component comp, int min, int pref, int max) 

para forzar un componente a ser de tamaño variable (permitir la contracción y creciente):

group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 

Esto permite que el componente cambie de tamaño entre tamaño cero (mínimo) a cualquier tamaño (Short.MAX_VALUE ya que el tamaño máximo significa "infinito"). Si quisiéramos que el componente no se redujera por debajo de su tamaño mínimo predeterminado, usaríamos GroupLayout.DEFAULT_SIZE en lugar de 0 en el segundo parámetro.

Para hacer un tamaño fijo componente (suprimir el cambio de tamaño):

group.addComponent(component, GroupLayout.PREFERRED_SIZE, 
    GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)... 

Curiosamente, los valores constantes son negativos, por lo que no puede ser confundido con las limitaciones reales.

1

También fue confundido acerca de cómo GroupLayout.DEFAULT_SIZE y GroupLayout.PREFERRED_SIZE se utilizan en GroupLayout.SequentialGroup.addComponent(Component c, int min, int pref, int max), incluso después de hacer referencia a la sección GroupLayout de los tutoriales de Java y un artículo titulado java.net Getting to know GroupLayout, part 1.

Buceando en el JDK 1.6.0_27 GroupLayout.javasource Encontré las respuestas en la clase ComponentSpring. Desde que yo era capaz de elaborar estas normas:

Si es necesario un mínimo:

  1. y la min valor proporcionado no es negativo, se devuelve ese valor.
  2. else si es PREFERRED_SIZE, seguimos las reglas para el tamaño preferido.
  3. si no se devuelve el tamaño mínimo del componente.

Si se necesita un tamaño preferido:

  1. y la pref valor proporcionado es no negativo, se devuelve dicho valor.
  2. si es DEFAULT_SIZE o PREFERRED_SIZE, devuelva el tamaño preferido del componente.

Si se necesita un tamaño máximo:

  1. y la max valor proporcionado es no negativo, se devuelve dicho valor.
  2. else si es PREFERRED_SIZE, seguimos las reglas para el tamaño preferido.
  3. si no se devuelve el tamaño máximo del componente.

Como ya se ha mencionado, las definiciones son negativas. Cualquier otro valor negativo para min, pref y max además de DEFAULT_SIZE o PREFERRED_SIZE son errores y aciertos.

La interacción entre los tamaños SequentialGroup.addComponent min, pref y max no fue inmediatamente evidente para mí desde el tutorial. Ahora sé por qué PREFERRED_SIZE,DEFAULT_SIZE,PREFERRED_SIZE es fijo, por qué no importa si el argumento del medio es DEFAULT_SIZE o PREFERRED_SIZE y cómo los NetBeans generaron valores de tamaño fijo como DEFAULT_SIZE,300,Short.MAX_VALUE funcionan.

Cuestiones relacionadas