2010-04-30 15 views
10

Estoy usando un FlowLayoutJPanel. El panel se ve feo cuando las alturas de los componentes secundarios son diferentes. Estoy buscando una solución para hacerlos alineados en la parte superior (similar a valign="top" con celdas de tabla en HTML).alineación superior para FlowLayout

+1

¿Ha echado un vistazo a MigLayout? –

Respuesta

14

Me di cuenta que pregunta fue hecha hace más de un año, pero como yo, pensé que muchos tropezar con este mensaje del foro y se dejó de intentar hacer una solución como la que se sugiere en el informe de errores (no funcionó para mí solo fyi).

De cualquier manera hay una mejor respuesta desde JDK 1.6. FlowLayout tiene el siguiente método:

public void setAlignOnBaseline(boolean alignOnBaseline) 

Si se utiliza este método en su FlowLayout y la ponemos a true, entonces cuando FlowLayout expone los componentes se comprobará la línea de base de cada componente y alinear el componente a lo largo de esta línea de base.

Pero eso no es todo lo que tiene que hacer.

El componente en cuestión deben prevalecer sobre los dos métodos siguientes de esta manera:

@Override 
public Component.BaselineResizeBehavior getBaselineResizeBehavior() { 
    return Component.BaselineResizeBehavior.CONSTANT_ASCENT; 
} 

@Override 
public int getBaseline(int width, int height) { 
    return 0; 
} 

Son métodos de JComponent y diseños y layoutmanagers utilizan estos métodos para determinar como se distribuyen los componentes.

Si sigue los pasos mencionados anteriormente, todos los componentes se alinearán a lo largo de la parte superior de cada fila. Por supuesto, si solo quiere usar un componente como JButton, obviamente tendrá que ampliarlo para lograr su objetivo deseado ... pero no es tanto trabajo como reemplazar el diseño de contenedor con una solución que debe depurar. Al menos eso pienso.

Buena suerte, -Asaf

+1

+1. La solución no me funcionó tampoco, pero creo que es porque existe para un propósito diferente. Como se afirma en el informe de error: * "Las tres opciones de alineación vertical serían superior, central e inferior. ** Sería establecer las cosas exactamente de la misma manera, ** pero colocar los componentes en el medio o en la parte inferior de el panel".* – Rempelos

1

Alguien más ha deseado esto, en forma de un informe de errores (que también enumera una solución alternativa).

Tenga una mirada en

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4295966

+0

Oh. Creo que seguiré la solución. ¡Gracias! – mrpaint

+0

En realidad, este informe de error tiene un propósito diferente: * "Por favor, agregue una opción al diseño de flujo para permitirme especificar la alineación vertical. Las tres opciones de alineación vertical serían superior, central e inferior. ** Sería establecer las cosas exactamente de la misma manera, ** pero coloque los componentes en el medio o en la parte inferior del panel. "* Por lo tanto, la solución del enlace permite elegir entre tres opciones para la colocación vertical de los componentes (FlowLayout siempre los coloca en la parte superior) pero todavía estarán alineados en el centro entre sí en caso de que tengan diferentes alturas. Solo señalando ... – Rempelos

1

Usted debe ser capaz de utilizar una BoxLayout. Es compatible con la alineación vertical. El único problema es que debe insertar componentes de puntal horizontal manualmente.

O podría intentar usar el Relative Layout. En su caso se debería utilizar:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS, 5); 
rl.setBorderGap(5); 
rl.setAlignment(RelativeLayout.LEADING); 
JPanel panel = new JPanel(rl); 
panel.add(...); 
+0

Claro que probé la alineación vertical pero no funcionó :( – mrpaint

+0

¿Qué no funciona? Le di dos sugerencias y ambas funcionan. ¿Leyó el tutorial de Swing sobre "Cómo usar el diseño de la caja" "? Si necesita más ayuda, publique su SSCCE: http: // sscce.org – camickr

+0

Finalmente, extendí el FlowLayout para que funcione como yo quiera y ahora es genial: ampliar el ancho: D Muchas gracias – mrpaint

Cuestiones relacionadas