Domanda

Sto cercando di creare un JTable che abbia intervalli di colonne disponibili. In particolare, sto cercando di annidare un JTable all'interno di un altro JTable e quando l'utente fa clic per visualizzare la tabella nidificata, dovrebbe espandersi per spingere verso il basso le righe sottostanti e riempire il spazio vuoto. Questo è simile a quello che vedi in MS Access in cui puoi annidare le tabelle e facendo clic sul pulsante Espandi su una riga ti mostreranno le voci corrispondenti nella tabella nidificata.

Se qualcuno conosce un modo per eseguire un intervallo di colonne con JTable , puoi indicarmi la giusta direzione? O se conosci un modo alternativo per farlo, sono aperto ai suggerimenti. L'applicazione viene creata con Swing. Gli elementi nella tabella, sia di livello alto che basso, devono essere modificabili in qualsiasi soluzione. L'uso di JTable nidificati non sarà un problema e qualsiasi altra soluzione dovrebbe prendere in considerazione anche questo.

È stato utile?

Soluzione

Come puntatore nella giusta direzione, prova questo articolo su SwingWiki che spiega il TableUI metodo di spanning della colonna abbastanza bene. Prima di questo, ho anche provato alcune alternative come l'override dei metodi di pittura di TableCellRenderer senza molto successo.

Altri suggerimenti

Devi scrivere la tua TableUI per la tabella principale. Può anche essere utile utilizzare il proprio TableModel per salvare dati aggiuntivi come se una riga fosse espansa. Ma questo è facoltativo.

Scrivo una UI uguale che espande una riga e mostra un editor di testo. Nell'interfaccia utente della tabella è necessario modificare l'altezza della riga in modo dinamico con table.setRowHeight (altezza). Inoltre è necessario copiare alcune cose dalla BaseTableUI perché non è possibile accedere alle cose private.

Basato sul codice di 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 (non disponibile dal 2012, vedi ora in archivio web )

Altre risorse:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top