Добавление столбцов в JTable динамически - PullRequest
1 голос
/ 14 марта 2010

У меня есть пустой 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" 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)

Ответы [ 3 ]

9 голосов
/ 14 марта 2010

Я думаю, вам нужно добавить столбец в модель данных вашей таблицы, а также в модель столбца. Модель столбцов обновляется при изменении модели данных, поэтому достаточно изменить модель данных. Вот пример:

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);
        }
    }
}
2 голосов
/ 17 июня 2015

Если вы хотите быстро добавить список имен строковых столбцов, используйте это.

DefaultTableModel tableModel = new DefaultTableModel();

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

jTable.setModel(tableModel);
1 голос
/ 14 марта 2010

У нас нет полной StackTrace, поэтому я не могу сказать наверняка, но я предполагаю, что исключение выдается на getColNam(i), где вы можете ссылаться на какую-то пустую коллекцию.

Попробуйте заменить его на

c.setHeaderValue("Test");

чтобы узнать.


Если это не проблема, вы можете попробовать TableColumn -Constructor без параметра:

TableColumn c = new TableColumn();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...