import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableRowSorter;
public class JTableColumnResizeOnClick extends JFrame {
public static void main(String[] args) {
new JTableColumnResizeOnClick().setVisible(true);
}
public JTableColumnResizeOnClick() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
MyModel model = new MyModel();
JTable table = new JTable(model);
/* set table column widths */
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn col = table.getColumnModel().getColumn(i);
int width = 26 + (int)(Math.random()*50);
int min = 25;
col.setPreferredWidth(width);
col.setMinWidth(min);
}
table.setRowSorter(new TableRowSorter<MyModel>(model));
add(new JScrollPane(table));
pack();
}
class MyModel extends AbstractTableModel {
@Override
public int getColumnCount() {
return 6;
}
@Override
public int getRowCount() {
return 10;
}
@Override
public Class<?> getColumnClass(int arg0) {
return String.class;
}
@Override
public String getColumnName(int column) {
return "col";
}
@Override
public Object getValueAt(int arg0, int arg1) {
return "Cell";
}
}
}
public class TableScrollPane extends JScrollPane {
public TableScrollPane(MyTable table) {
super(table);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// calculate width from table column widths & width of scroll bar
int width = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn col = table.getColumnModel().getColumn(i);
width += col.getPreferredWidth();
}
width += getVerticalScrollBar().getPreferredSize().width;
width -= 1; // ????????????
// set a height where cells are fully visible, and not cut off
int cellsToDisplay = 20;
int headerHeight = table.getTableHeader().getPreferredSize().height;
int height = headerHeight + (cellsToDisplay * table.getRowHeight());
// set size
setPreferredSize(new Dimension(width, height));
}
}
width -= 1; // ????????????
public TableScrollPane(MyTable table) {
super(table);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
// install table settings button
TableSettings settings = new TableSettings(table);
setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, settings);
// calculate width from table column widths & width of scroll bar
int width = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn col = table.getColumnModel().getColumn(i);
width += col.getPreferredWidth();
}
width += getVerticalScrollBar().getPreferredSize().width;
width -= 1; // ????????????
// set a height where all cells are fully visible
int cellsToDisplay = 20;
int headerHeight = table.getTableHeader().getPreferredSize().height;
int cornerHeight = getCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER)
.getPreferredSize().height;
int maxHeight = Math.max(headerHeight, cornerHeight);
int height = maxHeight + (cellsToDisplay * table.getRowHeight());
height += 2; // ????????????
// set size
setPreferredSize(new Dimension(width, height));
}
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
public class ScrollPaneTest extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ScrollPaneTest().setVisible(true);
}
});
}
public ScrollPaneTest() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
// add a scroll pane with a table
add(createScrollPane(createTable()));
pack();
setLocationRelativeTo(null);
}
private JTable createTable() {
JTable table = new JTable(50, 5);
table.setAutoCreateRowSorter(true);
/* set column widths */
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn col = table.getColumnModel().getColumn(i);
int pref = 0;
switch (i) {
case 0:
pref = 400;
break;
case 1:
pref = 75;
break;
case 2:
pref = 150;
break;
case 3:
pref = 100;
break;
case 4:
pref = 70;
break;
case 5:
pref = 100;
break;
}
col.setPreferredWidth(pref);
}
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
return table;
}
private JScrollPane createScrollPane(JTable table) {
JScrollPane sp = new JScrollPane(table);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
/*
* calculate proper width & height. If we skip this, and let the scroll
* pane pack itself automatically, the scroll pane packs the table
* smaller than it should be according to the set column widths..
* (Because we did not set AUTO_RESIZE_OFF, and don't want that!) So we
* calculate it manually:
*/
int width = 0;
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn col = table.getColumnModel().getColumn(i);
width += col.getPreferredWidth();
}
width += sp.getVerticalScrollBar().getPreferredSize().width;
// set a height where no cell is cut off.
int cellsToDisplay = 20;
int headerHeight = table.getTableHeader().getPreferredSize().height;
int height = headerHeight + (cellsToDisplay * table.getRowHeight());
sp.setPreferredSize(new Dimension(width, height));
return sp;
}
}