Переупорядочить столбцы в jtable сбоевать функциональность перетаскивания столбцаJAVA

Программисты JAVA общаются здесь
Anonymous
Переупорядочить столбцы в jtable сбоевать функциональность перетаскивания столбца

Сообщение Anonymous »

context
Я создаю проект Java Swing, который преобразует журналы Tomcat Access в столбцы базы данных, и пользователь может анализировать журналы с помощью SQL -запросов. Я использую JTable для отображения столбцов журнала доступа. позволяет пользователю перетаскивать столбцы, чтобы переупорядочить свою позицию. Я пытаюсь сохранить порядок столбцов пользователем. Например, сначала, когда обрабатывается файл access_log, приложение загружает все столбцы по выбору * из acl , теперь, если пользовательские запросы с проекцией всех столбцов, например, Select * From acl, где req = 'xyz' или запрос содержит те же столбцы, что и ранее, jtable должен сохранять орден. /> Я сначала загружаю данные из базы данных в мою пользовательскую Tablemodel , а затем установите эту Tablemodel in jtable . Если пользовательские запросы, которые имеют одинаковые столбцы, то я удаляю все старые столбцы в jtable и добавляю их в TableColumnModel в порядке, который был до запроса. Обратитесь к скриншоту, я попытался перемещать код состояния между временем начала и запросом, но он прыгает до начала времени, его исходная позиция была после record_id (как указано на скриншоте). Я также попробовал movecolumn () метод jtable и tablecolumnmodel , но все еще происходит такая же сбой.

Код: Выделить всё

public static void reOrderColumn(TableColumnModel newColumnModel, TableColumnModel oldColumnModel) {
try {
if(oldColumnModel.getColumnCount()==0){
return;
}
// Step 1: Map new columns by header name
Map newColsByName = new HashMap();
for (int i = 0; i < newColumnModel.getColumnCount(); i++) {
TableColumn col = newColumnModel.getColumn(i);
newColsByName.put(col.getHeaderValue().toString(), col);
}

// Step 2: Build list in old order
List reordered = new ArrayList();
for (int i = 0; i < oldColumnModel.getColumnCount(); i++) {
String name = oldColumnModel.getColumn(i).getHeaderValue().toString();
TableColumn col = newColsByName.get(name);
if (col != null) {
reordered.add(col);
}
}

// Step 3: Remove all columns
while (newColumnModel.getColumnCount() > 0) {
newColumnModel.removeColumn(newColumnModel.getColumn(0));
}

// Step 4: Re-add columns in desired order
for (TableColumn col : reordered) {
newColumnModel.addColumn(col);
}

} catch (Exception e) {
AppLogger.logSevere("Error in UIUtils.reOrderColumn", e);
}
}
код для настройки данных в jtable

Код: Выделить всё

private void setDataInTable(AbstractTableModel tableModel) {
TableColumnModel oldColModel = Utils.deepCopy(accessLogTbl.getColumnModel());

accessLogTbl.setModel(tableModel);

accessLogTbl.setRowSorter(new TableRowSorter(accessLogTbl.getModel()));

List dbColumnNames = new ArrayList();
for (int i = 0; i < accessLogTbl.getColumnCount(); i++) {
String columnName = accessLogTbl.getColumnName(i);
AccessLogInfoDTO infoDTO = AccessLogInfoService.getAccessLogInfoByDescription(columnName, false);
dbColumnNames.add(infoDTO!=null ? infoDTO.getDbColumnName().toLowerCase(): columnName.toLowerCase());
setAccessLogTableCellRenderer(i, infoDTO);
}
setDbColumnNames(dbColumnNames);
UIUtils.reOrderColumn(accessLogTbl.getColumnModel(), oldColModel);
}
код для извлечения данных из DB и настройки в Tablemodel

Код: Выделить всё

        conn = DBConnector.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();

String[] columnNames = new String[columnCount];
List> columnTypes;

public LogEntryTableModel(String[] columnNames, int rowCount) {
super(columnNames, rowCount);
}

public void setColumnTypes(List

Подробнее здесь: [url]https://stackoverflow.com/questions/79666158/reordering-the-columns-in-jtable-glitching-the-column-dragging-functionality[/url]

Вернуться в «JAVA»