1 package com.jsql.view.swing.table;
2
3 import javax.swing.*;
4 import javax.swing.event.ChangeEvent;
5 import javax.swing.event.ChangeListener;
6 import javax.swing.table.DefaultTableModel;
7 import javax.swing.table.TableColumn;
8 import javax.swing.table.TableColumnModel;
9 import java.beans.PropertyChangeEvent;
10 import java.beans.PropertyChangeListener;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public class FixedColumnTable implements ChangeListener, PropertyChangeListener {
28
29 private JTable mainTable;
30 private JTable fixedTable;
31 private JScrollPane scrollPane;
32
33
34
35
36
37 public void fixColumnSize(int fixedColumns, JScrollPane scrollPane) {
38 this.scrollPane = scrollPane;
39
40 this.mainTable = (JTable) scrollPane.getViewport().getView();
41 this.mainTable.setAutoCreateColumnsFromModel(false);
42 this.mainTable.addPropertyChangeListener(this);
43
44
45
46 this.fixedTable = new JTable() {
47 @Override
48 public boolean isCellEditable(int row,int column) {
49 return false;
50 }
51 };
52
53 this.fixedTable.setAutoCreateColumnsFromModel(false);
54
55 final DefaultTableModel modelFixedTable = new DefaultTableModel() {
56 @Override
57 public int getColumnCount() {
58 return 2;
59 }
60 @Override
61 public boolean isCellEditable(int row, int col) {
62 return false;
63 }
64 @Override
65 public int getRowCount() {
66 return FixedColumnTable.this.mainTable.getRowCount();
67 }
68 @Override
69 public Class<?> getColumnClass(int colNum) {
70 Class<?> columnClass;
71 if (colNum == 0) {
72 columnClass = String.class;
73 } else {
74 columnClass = super.getColumnClass(colNum);
75 }
76 return columnClass;
77 }
78 };
79
80 this.fixedTable.setModel(modelFixedTable);
81 this.fixedTable.setSelectionModel(this.mainTable.getSelectionModel());
82
83 this.fixedTable.setRowHeight(20);
84 this.fixedTable.setFocusable(false);
85 this.fixedTable.getTableHeader().setReorderingAllowed(false);
86
87
88
89 TableColumnModel columnModel = this.mainTable.getColumnModel();
90 for (var i = 0 ; i < fixedColumns ; i++) {
91 TableColumn column = columnModel.getColumn(i);
92 column.setMinWidth(0);
93 column.setMaxWidth(0);
94 this.fixedTable.getColumnModel().addColumn(new TableColumn(i));
95 }
96
97 this.fixedTable.getColumnModel().getColumn(0).setCellRenderer(new RowHeaderRenderer());
98 this.fixedTable.getColumnModel().getColumn(0).setResizable(false);
99 this.fixedTable.getColumnModel().getColumn(0).setPreferredWidth(38);
100 this.fixedTable.getColumnModel().getColumn(1).setCellRenderer(new RowHeaderRenderer());
101 this.fixedTable.getColumnModel().getColumn(1).setResizable(false);
102 this.fixedTable.getColumnModel().getColumn(1).setPreferredWidth(38);
103
104 this.mainTable.getRowSorter().addRowSorterListener(rowSorterEvent -> {
105 modelFixedTable.fireTableDataChanged();
106
107 for (var i = 0; i < this.mainTable.getRowCount() ; i++) {
108 this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 0), i, 0);
109 this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 1), i, 1);
110 }
111 });
112
113 this.mainTable.getSelectionModel().addListSelectionListener(listSelectionEvent ->
114 modelFixedTable.fireTableRowsUpdated(0, modelFixedTable.getRowCount() - 1)
115 );
116
117
118 for (var i = 0 ; i < this.mainTable.getRowCount() ; i++) {
119 this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 0), i, 0);
120 this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 1), i, 1);
121 }
122
123
124 this.fixedTable.setPreferredScrollableViewportSize(this.fixedTable.getPreferredSize());
125 scrollPane.setRowHeaderView(this.fixedTable);
126 scrollPane.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, this.fixedTable.getTableHeader());
127
128
129 scrollPane.getRowHeader().addChangeListener(this);
130 }
131
132
133
134
135 @Override
136 public void stateChanged(ChangeEvent e) {
137
138 JViewport viewport = (JViewport) e.getSource();
139 this.scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
140 }
141
142
143
144
145 @Override
146 public void propertyChange(PropertyChangeEvent e) {
147
148 if ("selectionModel".equals(e.getPropertyName())) {
149 this.fixedTable.setSelectionModel(this.mainTable.getSelectionModel());
150 }
151
152 if ("model".equals(e.getPropertyName())) {
153 this.fixedTable.setModel(this.mainTable.getModel());
154 }
155 }
156 }