2010-03-14 215 views
1

我有一個空的JTable,絕對沒有任何東西。我需要以某種方式動態生成表格列。簡化版本的代碼,我有我的嘗試:動態添加列到JTable

​​

但我發現了在線程中

例外 「AWT-EventQueue的 - 0」 java.lang.ArrayIndexOutOfBoundsException:0> = 0

我在做什麼錯?

下面是完整的堆棧跟蹤,如果有幫助:

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) 

回答

9

我認爲你需要的列添加到您的表的數據模型以及它的列模型。當數據模型發生變化時,列模型會更新,因此更改數據模型應該足夠了。這裏有一個例子:

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

我們沒有完整的堆棧跟蹤,所以我不能告訴是肯定的,但我想這異常是在getColNam(i)扔在那裏你可以指的是一些空的收藏。

嘗試通過

c.setHeaderValue("Test"); 

來取代它找出來。


如果這不是問題,你可以試試TableColumn -Constructor無參數:

TableColumn c = new TableColumn(); 
+0

getColName只是說明我在做什麼在code..The問題與沒有參數沒有構造方法是,如果我沒有模型索引創建列,表生成認爲它只有一個模擬方法一列,所以當我使用setValueAt填充一行時,它會在所有列中填充整行。 – jonasespelita

0

如果你想添加一個快捷方式字符串列名的列表,用這個。

DefaultTableModel tableModel = new DefaultTableModel(); 

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

jTable.setModel(tableModel);