java - manejo - ¿Qué administrador de diseño usas?
flowlayout vertical (22)
¿Qué gestor de diseño de GUI java usan todos? Últimamente, he estado usando MigLayout , que tiene algunos poderosos controles de componentes. Solo quería ver qué están usando otros desarrolladores además de los estándar JDK.
Comencé usando varios diseños anidados, luego pasé a GridBagLayout (lo cual es bastante frustrante). Desde entonces probé FormLayout (pero descubrí que no era adecuado para nada más que formularios) y me decidí por TableLayout, que en general estoy muy contento.
Desde entonces descubrí MiGLayout y aunque no he hecho mucho más que jugar con él, parece muy capaz, bastante similar a TableLayout y, probablemente, un poco más limpio.
La gran ventaja para mí es que MiGLayout se convertirá en parte del JDK, por lo que pretendo usarlo casi exclusivamente cuando lo haga.
Otra cosa que debes recordar es que no importa el LayoutManager de gran peso que tengas, siempre hay un lugar para algunos de los administradores de diseño más simples como GridLayout. He visto cosas horribles con GridBagLayout que se podrían haber hecho mucho más fácilmente con un administrador de diseño más simple.
Como resumen general, es posible que encuentre útil un artículo que escribí hace mucho tiempo al sol. No está actualizado con los últimos administradores de diseño, pero se concentra en la anidación efectiva de los administradores de diseño, en lugar de intentar hacer todo con un solo diseño.
Ver http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr
El único administrador de diseño que he encontrado, que realmente me gusta es el Administrador de diseño relativo . El Administrador de diseño relativo funciona de una manera consistente con la forma en que los cuadros de diálogo están organizados conceptualmente . Un inconveniente es que, aunque este administrador de diseño trata con restricciones aditivas. No parece tratar con restricciones de relación. Afortunadamente está bastante bien diseñado, y pude implementar esta característica.
Empecé a usar Swing recientemente y estoy usando GridBagLayout.
Estaba harto de todos esos administradores de diseño que necesitaban mucha configuración, no eran muy legibles o agotadores para hacerlo manualmente, así que escribí mi propio administrador de páginas muy simple que usa la abstracción de dos fotocornentos para mantener cada componente en su lugar. Puede agregar su componente de esta manera: parent.add(child,"topleft(0, 0.5)bottomright(0.5,1.0)");
Eche un vistazo aquí https://github.com/hageldave/UsefulStuff/blob/master/src/PhotoCornersLayout.java ;) usted es responsable de una distribución correcta, ya que no se trata de verificar superposiciones u otras deficiencias de su diseño.
GridBagLayout es potente pero bastante primitivo: el código que conecta el diseño es muy detallado. Esta biblioteca de utilidades (solo un archivo jar actual contiene alrededor de 10 clases) simplifica muchos trabajos: http://code.google.com/p/painless-gridbag/ El siguiente fragmento se cita de la página de inicio de ese sitio:
PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
gbl.row().cell(lblFirstName).cell(txtFirstName).fillX()
.cell(lblFamilyName).cell(txtFamilyName).fillX();
gbl.row().cell(lblAddress).cellXRemainder(txtAddress).fillX();
gbl.doneAndPushEverythingToTop();
He descubierto que para cualquier GUI no trivial utilizo diseños múltiples con GridBagLayout
anidados donde el panel principal puede tener un GridBagLayout
y cada GridBagLayout
(normalmente sin un borde o indicación de que es un panel) usa un diseño más simple donde sea posible. Normalmente utilizaré BorderLayout
, FlowLayout
y BoxLayout
para BoxLayout
más pequeños y simples. Al dividir pequeñas secciones de la GUI en subpaneles y usar el diseño más simple posible para controlar esa sección de la GUI, puede crear pantallas complejas y bien organizadas sin demasiados dolores de cabeza de las muchas opciones de GridBagLayout
. Además, al agrupar la funcionalidad de visualización en un panel, crea un código más legible.
La última aplicación Swing en la que trabajé usó FormsLayout de JGoodies .
MiG y FormLayout (JGoodies) son excelentes para el diseño manual (y casi todo el diseño finalmente se convierte en manual). Mi mayor consejo es diseñar sus vistas para que pueda arrancar completamente el diseño y volver a implementarlo sin afectar su aplicación (la buena separación de la vista y el controlador es clave aquí).
Definitivamente, eche un vistazo al enfoque PresentationModel de JGoodie para implementar vistas ''tontas''. Utilizo esta técnica con un constructor de GUI (utilizo GroupLayout con el complemento de compilación Jigloo GUI) para descartar prototipos rápidos. Después de 3 o 4 iteraciones, normalmente se va por la ventana y hacemos una reimplementación usando MiG o FormLayout.
EDITAR: Desde que escribí esto, me he movido a usar MiG para todos mis diseños, y ya no uso un generador de interfaz gráfica de usuario - es demasiado fácil de explicar con MiG.
Prefiero minimizar las dependencias en libs de terceros, por lo que generalmente es BoxLayout para diálogos y GridBagLayout para diseños "complicados". GridBagLayout es bastante fácil de entender, pero un poco difícil de configurar. Me escribí una herramienta para crear el código a partir de diseños HTML (espero que también ayude a los demás): http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
Siempre he sido un gran admirador de GridBagLayout. Se parece mucho a las tablas HTML, por lo que es intuitivo para los programadores web.
Soy un gran fan de usar TableLayout en lugar de GridBagLayout. Todo tiene sentido, mientras que cada vez que trato de usar GridBagLayout aplasta mi alma.
Soy un poco novato de Java.
Probé GridBagLayout, me rendí, luego probé BoxLayout, luego me rendí y luego hice mi propio diseño personalizado que funcionó. Con GridBag y Box I puse mi mejor intuición y los motores de diseño decidieron hacer algo diferente, sin ninguna forma aparente de depurarlos.
Con mi diseño personalizado, pude imprimir coordenadas y anchuras y alturas, para descubrir dónde estaba yendo mal. Es un poco mathy colocar cosas pero tienes todo el poder de Java para usar en lugar del vocabulario limitado de uno de los administradores de diseño integrados.
Por supuesto, era solo para un proyecto casero, nunca se te permitiría hacer esto en el trabajo.
También he usado GroupLayout . Una vez más, es un administrador de diseño JDK estándar a partir de Java6, pero también puede encontrar la biblioteca separada.
Uso BorderLayout el 90% de las veces al anidar BoxLayout y SpringLayout
Uso el GridBagLayout para el control, pero desde java1.6 voy a usar GroupLayout. Es impresionante.
Aquí una captura de pantalla y código de muestra para usarlo !.
texto alternativo http://img145.imageshack.us/img145/7844/screenshot1dz8.png
private void layoutComponents(){
JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
SequentialGroup hGroup = layout.createSequentialGroup();
JLabel nameLbl = new JLabel("Name");
JLabel countLbl = new JLabel("Amount");
JLabel dateLbl = new JLabel("Date(dd/MM/yy)");
hGroup.addGroup(layout.createParallelGroup().
addComponent(nameLbl).
addComponent(countLbl).
addComponent(dateLbl).
addComponent(go));
hGroup.addGroup(layout.createParallelGroup().
addComponent(name).
addComponent(count).
addComponent(date));
layout.setHorizontalGroup(hGroup);
SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(nameLbl).addComponent(name));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(countLbl).addComponent(count));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(dateLbl).addComponent(date));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(go));
layout.setVerticalGroup(vGroup);
frame.add( panel , BorderLayout.NORTH );
frame.add( new JScrollPane( textArea ) );
}
Yo uso DesignGridLayout para la mayoría de mis paneles.
Para los paneles raros que DesignGridLayout
no puede manejar por completo, utilizo una combinación de Borderlayout y DesignGridLayout
.
Con DesigngridLayout puede codificar manualmente sus diseños con un número mínimo de líneas de código, que son fáciles de escribir y leer:
DesignGridLayouut layout = new DesignGridLayout(myPanel);
layout.row().grid(lblFirstName).add(txfFirstName).grid(lblSurName).add(txfSurName);
layout.row().grid(lblAddress).add(txfAddress);
layout.row().center().add(btnOK, btnCancel);
Cada fila de la cuadrícula del panel está definida por una línea de código. Como puede ver, "dibujar" su panel es bastante sencillo.
Además, me parece que DesignGridLayout
tiene algunas características únicas (como su "cambio de tamaño vertical inteligente ").
Yo uso GridBagLayout para diseños similares a formularios, uso BorderLayout para diseños simples y FlowLayout para la cantidad de iconos / botones horizontales que tienen algunos espacios intermedios. Netbeans es también un buen constructor de GUI que puede evitar una gran cantidad de códigos de diseño tediosos para ahorrarle tiempo.
Yo uso el GridBagLayout . Parece tener un montón de código, pero hace diseños muy buenos.
También me gusta combinar BorderLayout con paneles GridBagLayout para una gran personalización.
Diseño de primavera que fue desarrollado para el constructor mantissa gui que es parte de netbeans.
GridBagLayout es utilizable. Una vez que te acostumbras a usarlo, funciona muy bien. Creo que los administradores de diseño estándar de JDK son bastante poderosos por sí mismos. Además, puedes minimizar la dependencia en bibliotecas de terceros.
MiGLayout es el administrador de diseño de GUI que es ampliamente utilizado por Java Developers.