Cómo crear este tipo de tablas

Iniciado por zonahurbana, 8 Febrero 2014, 01:10 AM

0 Miembros y 1 Visitante están viendo este tema.

zonahurbana

Creo que es bastante extenso el código para usar títulos en columnas y filas, por eso estaba pensando en usar un GridLayout en vez de tablas.
Pero no estoy muy seguro de cómo hacer esas particiones. Como se observa en la imagen, cada celda presenta dos datos, sólo que el espacio no está igual de dividido.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

NikNitro!

Lo único que se me ocurre es que las celdas "extrañas" estén divididas en 4 trozos iguales, pero que sólo marque el filo exterior y el de la primera. Crees eso factible? ;)

Salud

zonahurbana

Yo también estaba pensando en eso... pero, ¿cómo haría usted las divisiones?
No sé si está bien la idea de usar un GridLayout general y que cada celda ocupe un espacio en el GridLayout (así el primer componente es un JPanel vacío y Chile es el segundo JLabel agregado a ese GridLayout).

Y al llegar a las celdas con divisiones, usar otro GridLayout de (2, 2)...
Además no sé cómo hacer asignaciones a los espacios del GridLayout de manera no secuencial. Es decir, yo tendería a hacer un add para el primer valor, un add de un JPanel vacío, otro JPanel vacío y un add al otro valor.

Este es el código que he escrito para generar la tabla completa de momento:
       JDialog ventanaTabla = new JDialog(ventana, true);
       ventanaTabla.getContentPane().setLayout( new GridLayout(o+2, d+2) );
       ventanaTabla.getContentPane().add( new JPanel() );
       
       for(Paradero p : destinos)
           ventanaTabla.getContentPane().add( new JLabel(p.getNombre()));
       
       ventanaTabla.getContentPane().add( new JLabel("OFERTA") );
       
       for(int i=0; i<o; ++i) {
           ventanaTabla.getContentPane().add( new JLabel(origenes.get(i).getNombre()) );
           for(int j=0; j<d; ++j)
               ventanaTabla.getContentPane().add( matriz[i][j].getPanel() );
           ventanaTabla.getContentPane().add( new JLabel(""+origenes.get(i).getSaldo()) );
       }
           
       ventanaTabla.getContentPane().add( new JLabel("DEMANDA") );
       
       for(Paradero p : destinos)
           ventanaTabla.getContentPane().add( new JLabel(""+p.getSaldo()) );
       
       ventanaTabla.setLocationRelativeTo(ventana);
       ventanaTabla.setVisible(true);


Y este es el resultado:

Ya he conseguido darle cierta forma, pero sí que se ve bien mal.

La clase celda presenta 2 atributos, que son los valores que quiero usar (uno en el cuadro interno y otro fuera) y presenta un método GET que genera un JPanel y lo devuelve. En el JPanel se incluye un JLabel en la posición 0,0 y el otro JLabel en la posición 40,25.
   public JPanel getPanel() {
       JPanel panelCelda = new JPanel();
       panelCelda.setLayout( null );
       JLabel etiquetaCosto = new JLabel( String.valueOf(costo) );
       etiquetaCosto.setSize(40, 25);
       etiquetaCosto.setLocation(0, 0);
       panelCelda.add( etiquetaCosto );
       JLabel etiquetaSaldo = new JLabel( String.valueOf(saldo) );
       etiquetaSaldo.setSize(40, 25);
       etiquetaSaldo.setLocation(40, 25);      
       panelCelda.setSize(50, 80);
       panelCelda.setBorder( new LineBorder(Color.black, 2));
       return panelCelda;
   }


Muchas gracias por su ayuda. Espero me indique cómo lo haría usted porque tal vez estoy exagerando al usar un Layout de esa forma  :o
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

NikNitro!

Pues si, más o menos eso pensaba yo (que tampoco soy un versado en la materia, no te creas que sabes menos que yo  :rolleyes:) Pero vamos, mi pensamiento era similar a ese.

Saludos y ánimo ;)