2008-09-28 9 views
6

J'essaye de faire un JTable qui a des envergures de colonne disponibles. Plus précisément, je cherche à imbriquer un JTable à l'intérieur d'un autre JTable, et lorsque l'utilisateur clique pour voir la table imbriquée, il devrait étendre pour pousser les lignes ci-dessous et remplir l'espace vide. Ceci est similaire à ce que vous voyez dans MS Access où vous pouvez imbriquer des tables, et en cliquant sur le bouton de développement sur une ligne vous montrera les entrées correspondantes dans la table imbriquée.JTable colonne spanning

Si quelqu'un connaît un moyen d'exécuter une colonne avec JTable, pouvez-vous me diriger dans la bonne direction? Ou si vous connaissez une autre façon de le faire, je suis ouvert aux suggestions. L'application est en cours de construction avec Swing. Les éléments de la table, à la fois de haut niveau et de bas niveau, doivent pouvoir être édités dans n'importe quelle solution. L'utilisation de JTable s imbriqué ne posera aucun problème, et toute autre solution devra également en tenir compte.

Répondre

4

En tant que pointeur dans la bonne direction, essayez this article sur SwingWiki qui explique assez bien la méthode TableUI de la répartition des colonnes. Avant cela, j'ai également essayé quelques alternatives telles que le remplacement des méthodes de peinture TableCellRenderer sans grand succès.

+1

Le lien ne fonctionne plus :( –

+2

Copier si l'article est encore hors ligne: http://web.archive.org/web/20080726035429/http://www.swingwiki.org/howto:column_spanning – Synox

+0

Les archives montrent Erreur 500 sur cet article :( –

0

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 comme si une ligne était développée. Mais c'est optionnel. J'écris une TableUI égale qui développe une ligne et affiche un éditeur de texte. Dans la TableUI, vous devez modifier dynamiquement la hauteur de la ligne avec table.setRowHeight (height). De plus, il est nécessaire de copier des éléments de BaseTableUI, car vous ne pouvez pas accéder au contenu privé.

+1

Je ne vois toujours pas comment vous allez raconter votre JTable de fusionner les colonnes d'une ligne donnée. Je sais comment insérer une nouvelle ligne dans la table, mais comment puis-je dire à la table de fusionner ces cellules? – Elie

0

selon le code du 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 (disponible depuis 2012, voir maintenant web archive)

Autres ressources:

+0

Code-Guru dit "page introuvable" .C'est exactement pourquoi les réponses de lien seulement sont déconseillées. – Matthieu

Questions connexes