2010-03-14 4 views
1

У меня есть пустой JTable, абсолютно ничего в нем. Мне нужно динамически генерировать столбцы таблицы определенным образом. Упрощенная версия для кода у меня есть для моей попытки:Динамическое добавление столбцов в 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); 
    } 
} 

Но я получаю

Исключение в потоке "АВТ-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0> = 0

Что я делаю неправильно?

Вот полный StackTrace, если это поможет:

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

Мы не имеем полного StackTrace, поэтому я не могу сказать наверняка, но я предполагаю, что исключение в 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); 
Смежные вопросы