2010-03-14 10 views
1

J'ai une JTable vide, absolument rien dedans. J'ai besoin de générer dynamiquement ses colonnes de table d'une certaine manière. Une version simplifiée du code que j'ai pour ma tentative:Ajout dynamique de colonnes à JTable

@Action 
public void AddCol() { 
    for (int i = 0; i < 10; i++) { 
     TableColumn c = new TableColumn(i); 
     c.setHeaderValue(getColNam(i)); 
     table.getColumnModel().addColumn(c); 
    } 
} 

Mais je reçois un

Exception dans le thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0> = 0

Qu'est-ce que je fais mal?

est ici la stacktrace complète si elle aide:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 
     at java.util.Vector.elementAt(Vector.java:427) 
     at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632) 
     at engine.Processor$UpdateTable.run(Processor.java:131) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

Répondre

9

Je pense que vous devez ajouter la colonne de votre table modèle de données, ainsi que son modèle de colonne . Le modèle de colonne est mis à jour lorsque le modèle de données change, de sorte que la modification du modèle de données doit être suffisante. Voici un exemple:

public class TableColumnAdd { 
    private static DefaultTableModel tableModel; 
    private static int columnNumber = 1; 

    public static void main(String[] args) throws InterruptedException, InvocationTargetException { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override 
      public void run() { 
       tableModel = new DefaultTableModel(new Object[] { "Initial Column" }, 5); 
       JTable table = new JTable(tableModel); 
       JFrame frame = new JFrame("Table Column Add"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setBounds(100, 100, 600, 300); 
       frame.add(new JScrollPane(table)); 
       frame.setVisible(true); 
      } 
     }); 

     for (;;) { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        tableModel.addColumn("Column #" + columnNumber++); 
       } 
      }); 
      Thread.sleep(2000); 
     } 
    } 
} 
1

Nous n'avons la StackTrace complète, je ne peux pas dire à coup sûr, mais je suppose que l'exception est levée à getColNam(i) où vous pouvez se référer à une collection vide.

Essayez de le remplacer par

c.setHeaderValue("Test"); 

pour savoir.


Si ce n'est pas le problème, vous pouvez essayer le TableColumn -Constructor sans paramètre:

TableColumn c = new TableColumn(); 
+0

getColName est juste une méthode maquette pour montrer ce que je fais dans le problème code..The avec le constructeur sans param, si je crée la colonne sans l'indice modèle, la table générée pense qu'il a seulement une colonne, donc quand je remplis une ligne avec setValueAt, il remplit la ligne entière avec la valeur de toutes les colonnes. – jonasespelita

0

Si vous souhaitez ajouter rapidement une liste de noms de colonnes de chaînes, utilisez ceci.

DefaultTableModel tableModel = new DefaultTableModel(); 

for(String columnName : columnNames){ 
    tableModel.addColumn(columnName); 
} 

jTable.setModel(tableModel); 
Questions connexes