Pergunta

Eu estou tentando fazer uma JTable que tem extensões de coluna disponíveis. Especificamente, eu estou olhando para um ninho JTable dentro de outro JTable, e quando o usuário clica para visualizar a tabela aninhada, deve expandir-se para empurrar para baixo as linhas abaixo e preencher o espaço vazio. Isto é semelhante ao que você vê em MS Access, onde pode aninhar tabelas, e clicando no botão de expansão em uma linha irá mostrar-lhe as entradas correspondentes na tabela aninhada.

Se alguém sabe de uma maneira de realizar uma extensão de coluna com JTable, você pode por favor me aponte na direção certa? Ou se você souber de uma forma alternativa de fazer isso, eu estou aberto a sugestões. O aplicativo está sendo construído com Swing. Elementos na tabela, tanto de alto nível e baixo nível, tem que ser editável em qualquer solução. Usando JTables aninhados isso não será um problema, e qualquer outra solução teria que levar isso em consideração.

Foi útil?

Solução

Como um ponteiro na direção certa, tente este artigo em SwingWiki que explica o TableUI método de expansão da coluna muito bem. Antes disso, eu também tentou algumas alternativas, como substituindo os métodos de pintura TableCellRenderer sem muito sucesso.

Outras dicas

Você precisa escrever seu próprio TableUI para a tabela mestre. Ele também pode útil usar seu próprio TableModel para salvar os dados adicionais, como se uma linha é expandida. Mas isso é opcional.

I escrever um é igual a TableUI que expandir a linha e mostrar um editor de texto. No TableUI você precisa mudar a altura da linha dinamicamente com table.setRowHeight (altura). Também é necessário para copiar algumas coisas das BaseTableUI porque você não pode acessar o material privado.

Com base no 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);
  }
}

Fonte: http://www.codeguru.com/java/articles/125. shtml (não disponível desde 2012, vê agora em web arquivo )

Outros Recursos:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top