动态地将列添加到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); } } 

但我得到了一个

线程“AWT-EventQueue-0”中的exceptionjava.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) 

我认为您需要将列添加到表的数据模型及其列模型中。 当数据模型更改时,列模型会更新,因此更改数据模型应该足够了。 这是一个例子:

 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); } } } 

我们没有完整的StackTrace,所以我无法确定,但我想在getColNam(i)抛出exception,你可能会引用一些空的Collection。

尝试替换它

 c.setHeaderValue("Test"); 

找出来。


如果这不是问题,您可以尝试不带参数的TableColumn -Constructor:

 TableColumn c = new TableColumn(); 

如果要以快速方式添加字符串列名称列表,请使用此选项。

 DefaultTableModel tableModel = new DefaultTableModel(); for(String columnName : columnNames){ tableModel.addColumn(columnName); } jTable.setModel(tableModel);