2008-09-28 16 views
6

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

Si alguien sabe de una manera de realizar un tramo de columna 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 poder editarse en cualquier solución. El uso de JTable s anidados no será un problema, y ​​cualquier otra solución debería tener esto en cuenta también.

Respuesta

4

Como un puntero en la dirección correcta, pruebe this article en SwingWiki que explica bastante bien el método de columna TableUI que abarca bastante bien. Antes de esto, también probé algunas alternativas, como anular los métodos de pintura TableCellRenderer sin mucho éxito.

+1

El enlace ya no funciona :( –

+2

Copiar si el artículo aún está fuera de línea: http://web.archive.org/web/20080726035429/http://www.swingwiki.org/howto:column_spanning – Synox

+0

El archivo muestra Error 500 en este artículo :( –

0

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

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

+1

Todavía no veo cómo haría para hablar con su JTable para fusionar las columnas de una fila dada. Sé cómo insertar una nueva fila en la tabla, pero ¿cómo le digo a la tabla que combine esas celdas? – Elie

0

basado en el código de Código-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 (disponible desde 2012, ver ahora en web archive)

Otros recursos:

+0

Code-Guru dice "página no encontrada". Es exactamente por eso que se desaconsejan las respuestas de solo enlace. – Matthieu