Question

J'essaie de créer une JTable ayant des plages de colonnes disponibles. Plus précisément, je cherche à imbriquer un JTable dans un autre JTable , et lorsque l'utilisateur clique pour afficher le tableau imbriqué, il doit être développé de manière à repousser les lignes ci-dessous et à remplir le champ. espace libre. Ceci est similaire à ce que vous voyez dans MS Access où vous pouvez imbriquer des tables. Un clic sur le bouton Développer sur une ligne affichera les entrées correspondantes dans la table imbriquée.

Si quelqu'un connaît un moyen d'effectuer une étendue de colonne avec JTable , pouvez-vous me diriger dans la bonne direction? Ou si vous connaissez un autre moyen de le faire, je suis ouvert aux suggestions. L'application est en cours de construction avec Swing. Les éléments du tableau, qu'ils soient de haut ou de bas niveau, doivent pouvoir être modifiés dans n'importe quelle solution. En utilisant des JTable imbriqués, cela ne posera pas de problème et toute autre solution devra également en tenir compte.

Était-ce utile?

La solution

En tant que pointeur dans la bonne direction, essayez cet article sur SwingWiki qui explique la TableUI. méthode de colonne couvrant assez bien. Avant cela, j’avais aussi essayé quelques alternatives, comme redéfinir les méthodes de peinture TableCellRenderer sans grand succès.

Autres conseils

Vous devez écrire votre propre tableUI pour la table principale. Il peut également être utile d’utiliser votre propre TableModel pour enregistrer des données supplémentaires, par exemple si une ligne est développée. Mais c'est optionnel.

J'écris une TableUI égale qui développe une ligne et affiche un éditeur de texte. Dans TableUI, vous devez modifier la hauteur de ligne dynamiquement avec table.setRowHeight (height). En outre, il est nécessaire de copier des éléments de BaseTableUI car vous ne pouvez pas accéder aux éléments privés.

Basé sur le code 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);
  }
}

Source: http://www.codeguru.com/java/articles/125. shtml (non disponible depuis 2012, voir maintenant dans archive Web )

Autres ressources:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top