static void fillTableWithData(final JTable table, L rows, L colNames) { fillTableWithData(table, rows, toStringArray(colNames)); } // thread-safe static void fillTableWithData(final JTable table, L rows, S... colNames) { final DefaultTableModel model = fillTableWithData_makeModel(rows, colNames); // TODO: keep model if columns identical? setTableModel(table, model); } static DefaultTableModel fillTableWithData_makeModel(L rows, S... colNames) { Pair p = fillTableWithData_makeData(rows, colNames); ret new DefaultTableModel(p.a, p.b) { public Class getColumnClass(int column) { return or(_getClass(getValueAt(0, column)), S.class); } public bool isCellEditable(int rowIndex, int columnIndex) { ret false; } }; }