2011-05-10 14 views
6

En mi aplicación, estoy mostrando una lista de tablas con datos enormes. Es posible que todas las tablas no quepan en la ventana, necesitamos desplazarnos para ver las tablas inferiores. Aquí necesito expandir/colapsar la naturaleza a las tablas. El usuario puede seleccionar qué tablas le gustaría ver entre todas las tablas. Esta es mi captura de pantalla de muestra de la aplicación. enter image description hereCómo implementar expandir/colapsar naturaleza a JTables en la aplicación java swing

¿Cómo puedo hacerlo? Cualquier sugerencia sería muy apreciada.

Respuesta

1
public DesignGridTest(){ 

     JFrame frame = new JFrame("Example 1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel masterpanel = new JPanel(); 
     DesignGridLayout masterlayout = new DesignGridLayout(masterpanel); 

     JCheckBox chk1 = new JCheckBox("Check Box1"); 
     masterlayout.row().left().add(chk1);  

     JPanel panel1 = new JPanel(); 
     JTable table1 = new JTable(); 
     table1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null} 
      }, 
      new String [] { 
       "Title 1", "Title 2", "Title 3", "Title 4" 
      } 
     )); 
     panel1.add(table1); 
     final IRow row1 = masterlayout.row().grid().add(panel1); 
     chk1.setSelected(true); 
     chk1.addItemListener(new ItemListener() 
     { 
      @Override public void itemStateChanged(ItemEvent event) 
      { 
       if (event.getStateChange() == ItemEvent.SELECTED) 
        row1.show(); 
       else 
        row1.hide(); 
       frame.pack(); 
      } 
     });  
     frame.add(masterpanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static void main(String a[]){new DesignGridTest();} 

Añadir paneles (panel1, panel2 ..) a 'masterlayout' para obtener el aspecto deseado

3
  1. Usted puede tratar de JXTreeTable o TreeTable

  2. o puede cambiar la visibilidad de JTable para hacer un efecto expandir/contraer. Primero, cuando esté visible y use seleccionar colapsar, use setVisible(false); y realice la inversión en expandir. [No estoy seguro que va a funcionar o no.]

+0

Para el punto 2, puede funcionar, dependiendo del Administrador de diseños utilizado. Algunos LayoutManager pueden manejar la visibilidad dinámica de los componentes y otros no. – jfpoilpret

+0

@jfpoilpret: sí. es por eso que he escrito que no estoy seguro de ese punto, ya que no sabemos qué gestor de diseño OP está utilizando. –

2

La expandir/contraer efecto basado en la visibilidad, como se propone como segunda opción por Harry, puede ser fácil de conseguir si se utiliza DesignGridLayout:

DesignGridLayout layout = new DesignGridLayout(panel); 
... 
JCheckBox expand1 = newCheckBox("First"); 
layout.row().left().add(expand1); 
final IRow row = layout.row().grid().add(table1); 
expand.setSelected(true); 
expand.addItemListener(new ItemListener() 
{ 
    @Override public void itemStateChanged(ItemIvent event) 
    { 
     if (event.getStateChanged() == ItemIvent.SELECTED) 
      row.show(); 
     else 
      row.hide(); 
    } 
}; 

Repita el código anterior (después de "...") para cada tabla en su panel.

Con el código anterior, cada etiqueta se reemplaza con una casilla de verificación que, cuando no está seleccionada, oculta la tabla debajo.

Puede echar un vistazo a la aplicación de ejemplo DesignGridLayout (disponible como WebStart en la página de inicio) en la sección "Diseños dinámicos".

+0

Gracias por la respuesta rápida –

2

Otra alternativa es utilizar SwingX' JXTaskPane

JXTaskPaneContainer container = new JXTaskPaneContainer(); 
    forEach table: 
    JXTaskPane pane = new JXTaskPane(tableTitle); 
    pane.add(table); 
    container.add(pane); 
    somePanel.add(new JScrollPane(container); 

Editado (olvidó el panel de tareas en el fragmento, no publicar antes-café ;-)

+0

¿Dónde puedo encontrar este archivo jar y cómo usarlo con Netbeans IDE? –

Cuestiones relacionadas