Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] JPanel y Layouts para crear un formulario

Estas en el tema de JPanel y Layouts para crear un formulario en el foro de Java en Foros del Web. Hola. Estoy desarrollando mi primera aplicación con Java Swing, e intento crear un JDialog que contenga un formulario, tipo a los de internet, para que ...
  #1 (permalink)  
Antiguo 04/09/2013, 02:44
 
Fecha de Ingreso: agosto-2011
Mensajes: 58
Antigüedad: 12 años, 8 meses
Puntos: 3
JPanel y Layouts para crear un formulario

Hola.

Estoy desarrollando mi primera aplicación con Java Swing, e intento crear un JDialog que contenga un formulario, tipo a los de internet, para que el usuario introduzca algunos datos.

No obstante, me estoy volviendo loco, ya que no tengo ni idea de que layouts usar, ni cómo.

Lo que quiero conseguir es lo siguiente, de ABAJO A ARRIBA:
- area para botones OK y CANCEL, de alto fijo
- area con scroll, de alto fijo, para mostrar un texto, no modificable por el usuario
- area para el formulario, que ocupe el resto de la altura de la ventana

El formulario va a ser una serie de filas, cada una con un JLabel a la izda, y un JTextField a la dcha (vamos, lo normal), pero como digo, no sé cómo hacerlo...¿cada fila en un JPanel uno encima de otro? Y de ser así, ¿cómo consigo colocarlos uno encima de los otros?

Espero que podáis ayudarme.
Gracias, un saludo.
  #2 (permalink)  
Antiguo 04/09/2013, 04:49
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: JPanel y Layouts para crear un formulario

Hola:

Haciendo un único contenedor en el que metes todos los componentes, te pueden valer los siguientes layout.

Puedes conseguirlo con GridBagLayout http://www.chuidiang.com/java/layout...dBagLayout.php

Quizás también te puede valer SpringLayout http://docs.oracle.com/javase/tutori...ut/spring.html

Si prefieres hacer varios paneles (por ejemplo tres, uno con los campos, el otro sería directamente un JScrollPane con el area de texto y otro panel para los botones) puedes meter los tres paneles en el dialogo usando un BoxLayout, que te permite ponerlos uno encima de otro http://chuwiki.chuidiang.org/index.php?title=BoxLayout

Luego, cada uno de esos paneles, lleva su propio layout. Para el de campos sigue valiendo SpringLayout, el JScrollPane para el area de texto funciona solo y para el de botones puedes usar un FlowLayout (si quieres los botones juntos en el lateral izquierdo o derecho) o un SpringLayout (si quires uno a la izquierda y otro a la derecha).

Por supuesto, hay muchas más posibilidades.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 04/09/2013, 06:19
 
Fecha de Ingreso: agosto-2011
Mensajes: 58
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: JPanel y Layouts para crear un formulario

Hola!

Chuidiang, ¡muy buena tu información, creo que me va a ser muy útil! Voy a intentar lo siguiente: un gridbaglayout o un boxlayout que contenga a un jpanel con springlayout (para el formulario), un jscrollpane y un jpanel con flowlayout (para los botones). Vamos, lo que tú me has sugerido.

Solo tengo una duda antes de intentar hacerlo: ¿cómo puedo dar una altura fija a uno de los paneles/componentes contenidos en el boxlayout y/o gridbaglayout? He visto cómo hacer que rellene todo el espacio posible, y que rellene solamente lo necesario para contener a sus componentes, pero no cómo darle una altura fija.
  #4 (permalink)  
Antiguo 04/09/2013, 08:41
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: JPanel y Layouts para crear un formulario

Con los layout no puedes conseguir una altura fija.

Un layout pregunta a los componentes por sus getPreferredSize(), getMaximumSize() y getMinimumSize() para decidir que tamaño darle. La mejor forma de conseguir un tamaño fijo es que getPreferredSize() devuelva ese tamaño y si no se suficiente, que los otros dos métodos también devuelvan eso.

Sin embargo, tienes un problema con los paneles (contenedores en general), ya que estos calculan su preferredsize preguntando a los elementos que hay dentro, por lo intentar configurar el preferredsize con setPreferredSize() suele ser inútil. Incluso algunos elementos, como el JLabel, devuelve getPreferredSize() calculado en función del texto que llevan dentro. Para evitar esto si te da problemas y no funcionan los setMaximumSize() y set MinimumSize(), la opción es heredar de estos componentes y sobreescribir los tres métodos getpreferred/minimum/maximumSize para que devuelvan el valor que tú quieras.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 05/09/2013, 10:13
 
Fecha de Ingreso: agosto-2011
Mensajes: 58
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: JPanel y Layouts para crear un formulario

Gracias, intentaré hacer lo de sobreescribir esos métodos hoy o mañana.

Si me sale todo bien, pongo el código.

Un saludo
  #6 (permalink)  
Antiguo 07/09/2013, 11:20
 
Fecha de Ingreso: agosto-2011
Mensajes: 58
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: JPanel y Layouts para crear un formulario

¡Hola!

Siguiendo tus instrucciones he conseguido llevar a cabo lo que quería, así que muchas gracias por la ayuda.

Pego el código:

Código Java:
Ver original
  1. import java.awt.FlowLayout;
  2. import java.awt.Frame;
  3. import javax.swing.BoxLayout;
  4. import javax.swing.JButton;
  5. import javax.swing.JDialog;
  6. import javax.swing.JLabel;
  7. import javax.swing.JPanel;
  8. import javax.swing.JTextField;
  9. import javax.swing.SpringLayout;
  10. import miProyecto.CustomJPanel;
  11. import miProyecto.CustomJScrollPane;
  12.  
  13. public class CustomDialog extends JDialog {
  14.    
  15.     JTextField inputDescripcion, inputCodigo;
  16.  
  17.     public CustomDialog(String title) {
  18.         // usa el constructor de la super clase
  19.         super ( (Frame)null, title, true );
  20.  
  21.         // configura el layout: BoxLayout
  22.         getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
  23.        
  24.         // crea el JPanel raíz del form, con SpringLayout
  25.         JPanel formRoot = new JPanel();
  26.         SpringLayout layout = new SpringLayout();
  27.         formRoot.setLayout(layout);
  28.  
  29.         // añade primera fila del formulario
  30.         JLabel label = new JLabel ("Código");
  31.         inputCodigo = new JTextField(20);
  32.         formRoot.add(label);
  33.         formRoot.add(inputCodigo);
  34.         layout.putConstraint(SpringLayout.NORTH, label, 10, SpringLayout.NORTH, formRoot);
  35.         layout.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, formRoot);
  36.         layout.putConstraint(SpringLayout.NORTH, inputCodigo, 5, SpringLayout.NORTH, formRoot);
  37.         layout.putConstraint(SpringLayout.WEST, inputCodigo, 100, SpringLayout.WEST, formRoot);
  38.  
  39.         // añade segunda fila del formulario
  40.         label = new JLabel ("Descripción");
  41.         inputDescripcion = new JTextField(20);
  42.         formRoot.add(label);
  43.         formRoot.add(inputDescripcion);
  44.         layout.putConstraint(SpringLayout.NORTH, label, 40, SpringLayout.NORTH, formRoot);
  45.         layout.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, formRoot);
  46.         layout.putConstraint(SpringLayout.NORTH, inputDescripcion, 35, SpringLayout.NORTH, formRoot);
  47.         layout.putConstraint(SpringLayout.WEST, inputDescripcion, 100, SpringLayout.WEST, formRoot);
  48.        
  49.         getContentPane().add(formRoot);
  50.        
  51.         // borde inferior del JPane a 20px de la última fila (así el JPanel se adapta a la altura)
  52.         layout.putConstraint(SpringLayout.SOUTH, formRoot, 20, SpringLayout.SOUTH, label);
  53.  
  54.         // añade JScrollPane de altura fija, debajo del formulario
  55.         CustomJScrollPane scrollPane = new CustomJScrollPane();
  56.         getContentPane().add(scrollPane);
  57.  
  58.         // añade los botones de OK y cancel (zona de altura fija)
  59.         CustomJPanel buttonPane = new CustomJPanel();
  60.         buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
  61.         getContentPane().add(buttonPane);
  62.  
  63.         JButton cancelButton = new JButton("Cancelar");
  64.         //cancelButton.setActionCommand("Cancel");
  65.         buttonPane.add(cancelButton);
  66.  
  67.         JButton okButton = new JButton("Aceptar");
  68.         //okButton.setActionCommand("OK");
  69.         buttonPane.add(okButton);
  70.         getRootPane().setDefaultButton(okButton);
  71.  
  72.         // determina tamaño de la ventana, adaptándose en altura al contenido
  73.         setBounds(100, 100, 450, getContentPane().getPreferredSize().height);
  74.        
  75.         // hace visible
  76.         setVisible(true);
  77.        
  78.     }
  79.  
  80. }

Y aquí las clases CustomJPanel y CustomJScrollPane para poder hacer que tengan altura fija (son iguales, pero heredan de distintas clases)

Código Java:
Ver original
  1. import java.awt.Dimension;
  2. import javax.swing.JPanel;
  3.  
  4. public class CustomJPanel extends JPanel {
  5.  
  6.     @Override
  7.     public Dimension getMaximumSize() {
  8.         Dimension superDim = super.getMaximumSize();
  9.         return new Dimension(superDim.width, 60);
  10.     }
  11.  
  12.     @Override
  13.     public Dimension getMinimumSize() {
  14.         Dimension superDim = super.getMinimumSize();
  15.         return new Dimension(superDim.width, 60);
  16.     }
  17.  
  18.     @Override
  19.     public Dimension getPreferredSize() {
  20.         Dimension superDim = super.getPreferredSize();
  21.         return new Dimension(superDim.width, 60);
  22.     }
  23.  
  24. }

Código Java:
Ver original
  1. import java.awt.Dimension;
  2. import javax.swing.JScrollPane;
  3.  
  4. public class CustomJScrollPane extends JScrollPane {
  5.  
  6.     @Override
  7.     public Dimension getMaximumSize() {
  8.         Dimension superDim = super.getMaximumSize();
  9.         return new Dimension(superDim.width, 150);
  10.     }
  11.  
  12.     @Override
  13.     public Dimension getMinimumSize() {
  14.         Dimension superDim = super.getMinimumSize();
  15.         return new Dimension(superDim.width, 150);
  16.     }
  17.  
  18.     @Override
  19.     public Dimension getPreferredSize() {
  20.         Dimension superDim = super.getPreferredSize();
  21.         return new Dimension(superDim.width, 150);
  22.     }
  23.  
  24. }

Etiquetas: formulario, jpanel, layouts
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:01.