Reputation: 123
I have made table with freezed first column, I mean - first column is not scrollable, works the same as in MS Excel.
Problem is, I don't know how to use row sorter, to sort both tables in the same time. Now sorting works for every column except first, frozen one.
Can someone give me some clue or solution? Many thanks in advance
My code is based on this example:
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class TestClass extends javax.swing.JFrame {
private DefaultTableModel tableModel;
private javax.swing.JScrollPane jScrollPane;
private javax.swing.JTable jTable;
private javax.swing.JTable freezeTable;
private int fixedColumns = 1;//number of colums to be freezed
public TestClass() {
jScrollPane = new javax.swing.JScrollPane();
jTable = new javax.swing.JTable();
jScrollPane.setViewportView(jTable);
getContentPane().add(jScrollPane);
setPreferredSize(new Dimension(300,200));
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
Object[][] data = {{"Item1", "Papaya", "Letus", "Cashew", "Pine"},
{"Item2", "Orange", "Carrot", "Pine nut", "Oak"},
{"Item3", "Apple", "Pepper", "Pistacho", "Cypress"}};
Object[] headers = {"Item", "Fruit", "Vegetable", "Nuts", "Tree"};
tableModel = new DefaultTableModel(data, headers);
jTable.setModel(tableModel);
jTable.setAutoCreateColumnsFromModel( false );
for (int i=0; i<jTable.getColumnCount(); i++){
jTable.getColumnModel().getColumn(i).setMinWidth(100);
}
jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
jTable.setRowSorter(new TableRowSorter<DefaultTableModel>(tableModel));
jTable.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if ("selectionModel".equals(e.getPropertyName())) {
freezeTable.setSelectionModel(jTable.getSelectionModel());
}
if ("dataModel".equals(e.getPropertyName())) {
freezeTable.setModel(jTable.getModel());
}
}
});
freezeTable = new javax.swing.JTable();
freezeTable.setAutoCreateColumnsFromModel(false);
freezeTable.setModel(tableModel);
freezeTable.setSelectionModel(jTable.getSelectionModel());
freezeTable.setFocusable(false);
for (int i = 0; i < fixedColumns; i++) {
TableColumnModel colModel = jTable.getColumnModel();
TableColumn column = colModel.getColumn(0);
colModel.removeColumn(column);
freezeTable.getColumnModel().addColumn(column);
}
freezeTable.setPreferredScrollableViewportSize(freezeTable.getPreferredSize());
jScrollPane.setRowHeaderView(freezeTable);
jScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, freezeTable.getTableHeader());
jScrollPane.getRowHeader().addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// Sync the scroll pane scrollbar with the row header
JViewport viewport = (JViewport) e.getSource();
jScrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
}
});
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new TestClass().setVisible(true);
}
});
}
}
Upvotes: 4
Views: 1021
Reputation: 347314
Apply the row sorter to both tables...
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(tableModel);
jTable.setRowSorter(sorter);
//...
freezeTable.setRowSorter(sorter);
Upvotes: 5