package com.bagri.tools.vvm.model; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import java.util.List; public class GridTableModel extends AbstractTableModel { private TableColumnModel columnModel; private List<ColumnConfig> columnConfigs; final private GridDataLoader loader; private transient List<GridRow> data; private boolean loaded; public GridTableModel(List<ColumnConfig> columns, GridDataLoader loader) { this.loader = loader; this.columnConfigs = columns; DefaultTableColumnModel cm = new DefaultTableColumnModel(); for (int i = 0; i < columns.size(); i++) { ColumnConfig cc = columns.get(i); TableColumn tc = new TableColumn(i); tc.setHeaderValue(cc.getHeader()); if (null != cc.getMaxWidth()) { tc.setMaxWidth(cc.getMaxWidth()); } if (null != cc.getMinWidth()) { tc.setMinWidth(cc.getMinWidth()); } if (null != cc.getPreferredWidth()) { tc.setPreferredWidth(cc.getPreferredWidth()); } if (null != cc.getWidth()) { tc.setWidth(cc.getWidth()); } if (null != cc.getResizable()) { tc.setResizable(cc.getResizable()); } cm.addColumn(tc); } setColumnModel(cm); } public TableColumnModel getColumnModel() { return columnModel; } public void setColumnModel(TableColumnModel columnModel) { this.columnModel = columnModel; } @Override public int getRowCount() { return (null != data) ? data.size() : 0; } @Override public int getColumnCount() { return getColumnModel().getColumnCount(); } @Override public String getColumnName(int columnIndex) { return getColumnModel().getColumn(columnIndex).getHeaderValue().toString(); } @Override public Class<?> getColumnClass(int columnIndex) { return columnConfigs.get(columnIndex).getColumnClass(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (!isLoaded()) { load(); } GridRow row = getRow(rowIndex); return row.getValueAt(columnIndex); } public GridRow getRow(int rowIndex) { if (!isLoaded()) { load(); } if (rowIndex >= data.size() || rowIndex < 0) { return null; } return data.get(rowIndex); } public void load() { data = loader.loadData(); setLoaded(true); } public boolean isLoaded() { return loaded; } public void setLoaded(boolean loaded) { this.loaded = loaded; } }