Pregunta

Estoy tratando de hacer un JTable que tenga columnas disponibles. Específicamente, estoy buscando anidar un JTable dentro de otro JTable , y cuando el usuario hace clic para ver la tabla anidada, debería expandirse para empujar hacia abajo las filas de abajo y llenar el espacio vacio. Esto es similar a lo que ve en MS Access donde puede anidar tablas, y al hacer clic en el botón de expansión en una fila le mostrará las entradas correspondientes en la tabla anidada.

Si alguien conoce una forma de realizar un intervalo de columnas con JTable , ¿puede indicarme la dirección correcta? O si conoce una forma alternativa de hacerlo, estoy abierto a sugerencias. La aplicación se está construyendo con Swing. Los elementos de la tabla, tanto de alto como de bajo nivel, deben ser editables en cualquier solución. El uso de JTable anidados no será un problema, y ??cualquier otra solución debería tener esto en cuenta también.

¿Fue útil?

Solución

Como puntero en la dirección correcta, intente este artículo en SwingWiki que explica la TablaUI Método de columna que abarca bastante bien. Antes de esto, también probé algunas alternativas, como anular los métodos de pintura de TableCellRenderer sin mucho éxito.

Otros consejos

Debe escribir su propia TableUI para la tabla maestra. También puede ser útil usar su propio TableModel para guardar datos adicionales como si se ampliara una fila. Pero esto es opcional.

Escribo una TableUI igual que expandir una fila y mostrar un editor de texto. En la TableUI debe cambiar la altura de la fila dinámicamente con table.setRowHeight (altura). También es necesario copiar algunas cosas de la BaseTableUI porque no puedes acceder a las cosas privadas.

Basado en el código de Code-Guru:

/*
 *  (swing1.1beta3)
 * 
 * |-----------------------------------------------------|
 * |   1st  |      2nd    |      3rd         |
 * |-----------------------------------------------------|
 * |    |    |    |    |        |        |
 */
//package jp.gr.java_conf.tame.swing.examples;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

import jp.gr.java_conf.tame.swing.table.*;

/**
 * @version 1.0 11/09/98
 */
public class MultiWidthHeaderExample extends JFrame {

  MultiWidthHeaderExample() {
    super( "Multi-Width Header Example" );

    DefaultTableModel dm = new DefaultTableModel();
    dm.setDataVector(new Object[][]{
      {"a","b","c","d","e","f"},
      {"A","B","C","D","E","F"}},
    new Object[]{"1 st","","","","",""});

    JTable table = new JTable( dm ) {
      protected JTableHeader createDefaultTableHeader() {
        return new GroupableTableHeader(columnModel);
      }
    };
    TableColumnModel cm = table.getColumnModel();
    ColumnGroup g_2nd = new ColumnGroup("2 nd");
    g_2nd.add(cm.getColumn(1));
    g_2nd.add(cm.getColumn(2));
    ColumnGroup g_3rd = new ColumnGroup("3 rd");
    g_3rd.add(cm.getColumn(3));
    g_3rd.add(cm.getColumn(4));
    g_3rd.add(cm.getColumn(5));
    GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
    header.addColumnGroup(g_2nd);
    header.addColumnGroup(g_3rd);
    JScrollPane scroll = new JScrollPane( table );
    getContentPane().add( scroll );
    setSize( 400, 100 );  
    header.revalidate(); 
  }

  public static void main(String[] args) {
    MultiWidthHeaderExample frame = new MultiWidthHeaderExample();
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent e ) {
        System.exit(0);
      }
    });
    frame.setVisible(true);
  }
}

Fuente: http://www.codeguru.com/java/articles/125. shtml (no disponible desde 2012, consulte ahora en archivo web )

Otros recursos:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top