Veamos como un desarrollador normal creando un formulario
Código
package com.ejemplo; public PanFeoContacto() { initComponents(); } // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jSpinner1 = new javax.swing.JSpinner(); jLabel1.setText("Nombre"); jLabel2.setText("Apellido"); jLabel3.setText("Direcion"); jLabel4.setText("Edad"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel4)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// </editor-fold> // Variables declaration - do not modify private javax.swing.JSpinner jSpinner1; // End of variables declaration }
todo el código es incomprensible inmantenible difícil de entender de modificar es mas el ide no te permite editar casi la totalidad de código
es mas para modificarlo tienes que usar una serie de pasos en el ide eso de precodigo postcodigo solo funciona con netbeans y require un horrible xml de ayuda que te lo crea el ide solo funciono en netbeans
estorba si usas eclipse y esto solo es un ejemplo trivial la realidad es que me vi en la desgracia de usar formulario 10 veces más complicados con 10 veces de código con más de 50 componentes con paneles dentro de otro y con diferentes layauts y enzima al estilo wizard para que quepa en la pantalla casi me dieron ganas de renunciar al ver que cada vez que modifica un componente todo se desarmaba desaparecían paneles enteros y solo funcionaba con la paleta
Solo pensar en hacerle refactoring es ciencia ficion
Bueno pues ágamos lo a mano solo usando swing
Código
package com.ejemplo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; public class PanelContacto { public PanelContacto() { panel.add(new JLabel("Nombre"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0)); panel.add(new JTextField(), new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0)); panel.add(new JLabel("Apellido"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0)); panel.add(new JTextField(), new GridBagConstraints(1, 2, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0)); panel.add(new JLabel("Direcion"), new GridBagConstraints(0, 3, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0)); panel.add(new JTextField(), new GridBagConstraints(1, 3, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0)); panel.add(new JLabel("Edad"), new GridBagConstraints(0, 4, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0)); panel.add(new JSpinner(new SpinnerNumberModel(1, 1, 100, 1)), new GridBagConstraints(1, 4, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0)); } return respuesta; } }
Es feo pero es 100 veces mejor que la opción anterior además requiere algunos hacks(los layauts de swing son malos)
Luego de hacer refactoring y usar el patrón de diseño builder + interface fluida
Código
package com.ejemplo; import java.awt.Container; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; public class PanelConPatronBuilder { public PanelConPatronBuilder() { } agregaFila("Edad", new JSpinner(new SpinnerNumberModel(1, 1, 100, 1))).getPanel(); } }
U eso es genial mira el código habla por sí solo pero requiera ayuda de una clase echa en casa que tendrías que mantener y crear en caso de que la pierdas
Aquí está la clase
Código
package com.ejemplo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; public class PanelBuilder { int cont = -1; public PanelBuilder() { } panel.add(jTextField, restricionComponente(cont)); return this; } return new GridBagConstraints(1, cont, 1, 1, 1, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.HORIZONTAL, insets, 0, 0); } return new GridBagConstraints(0, cont, 1, 1, 0, 0, GridBagConstraints.FIRST_LINE_START, GridBagConstraints.NONE, insets, 0, 0); } return respuesta; } }
Ahora si es enserio usando la ayuda de un librería externa bien echa
package com.ejemplo;
import java.awt.Container;
import org.metawidget.swing.SwingMetawidget;
Código
public class PanelContactoMetaWidtget { SwingMetawidget swingMetawidget =new SwingMetawidget(); swingMetawidget.setToInspect(new Contacto()); return swingMetawidget; } }
Y requiere un pojo de toda la vida
package com.ejemplo;
Código
y esta librería te obliga a programar orientado a objetos lo cual es bueno porque en un proyecto grande igual tendrías todo partido en varias clases pongámonos esta clase librería te pide que crees la clase contacto que es un pojo que lo arias de toda maneras en caso de que el contacto cambie automáticamente la vista se actualizaría
public class Contacto { private int edad; return nombre; } this.nombre = nombre; } return apellido; } this.apellido = apellido; } return direcion; } this.direcion = direcion; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } }
Digamos que tienes 100 paneles de contacto en caso de que cambie el contacto solo modificarías la clase contacto
metawidget http://metawidget.org/
builder http://architects.dzone.com/news/factories-builders-and-fluent-