class LazyTableModel extends AbstractTableModel {
private List<List<String>> data;
public LazyTableModel() {
data = new ArrayList<>();
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return data.get(0).size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex).get(columnIndex);
}
public void loadVisibleData(int startIndex, int endIndex) {
}
}
JTable table = new JTable(new LazyTableModel());
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.getViewport().addChangeListener(e -> {
JViewport viewport = (JViewport) e.getSource();
int startIndex = table.rowAtPoint(viewport.getViewPosition());
int endIndex = table.rowAtPoint(new Point(viewport.getViewPosition().x, viewport.getViewPosition().y + viewport.getHeight()));
((LazyTableModel) table.getModel()).loadVisibleData(startIndex, endIndex);
});
Class MyRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
if (value != null) {
setText(value.toString());
} else {
setText("");
}
return this;
}
}
table.setDefaultRenderer(Object.class, new MyRenderer());
Class MyEditor extends DefaultCellEditor {
public MyEditor() {
super(new JTextField());
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row,
int column) {
if (value != null) {
((JTextField) editorComponent).setText(value.toString());
} else {
((JTextField) editorComponent).setText("");
}
return editorComponent;
}
}
table.setDefaultEditor(Object.class, new MyEditor());