static void fillTableWithStrings(final JTable table, L> rows, L colNames) { fillTableWithStrings(table, rows, toStringArray(colNames)); } // thread-safe static void fillTableWithStrings(final JTable table, L> rows, S... colNames) { final DefaultTableModel model = fillTableWithStrings_makeModel(rows, colNames); awtIfNecessary { setTableModel(table, model); } } static DefaultTableModel fillTableWithStrings_makeModel(L> rows, S... colNames) { Object[][] data = new Object[rows.size()][]; int w = 0; for (int i = 0; i < rows.size(); i++) { L l = rows.get(i); Object[] r = new Object[l.size()]; for (int j = 0; j < l.size(); j++) r[j] = l.get(j); data[i] = r; w = Math.max(w, l.size()); } O[] columnNames = new O[w]; for (int i = 0; i < w; i++) columnNames[i] = i < l(colNames) ? colNames[i] : "?"; ret new DefaultTableModel(data, columnNames); }