我有以下JTable(实际上它是来自Netbeans的ETable)。它延伸到它所在的容器 - 我想保留它,而不是使用JTable.AUTO_RESIZE_OFF
我想以编程方式拟合它,如下所示,调整每列的大小以适应单元格内容或列标题文本,并使最右边的列填充剩余空间。我怎么能这样做?
答案 0 :(得分:0)
您可以关闭自动调整大小。在这种情况下,列将根据内容自动调整大小。但在这种情况下,如果总列宽小于表格的宽度,则右侧会出现空白区域。如果它更大,则会出现水平滚动条。
您可以使用TableColumn.setPreferredWidth
为每列分配首选宽度。 Swing会尝试根据这个分配额外的空间。但这也无法保证。
答案 1 :(得分:0)
您必须将autoResize设置为OFF(setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
),但您还需要一个帮助方法来调整列的大小。
这是一个扩展JTable的自定义类,但您可以轻松引用现有的JTable:
public void resizeColumnWidth() {
int cumulativeActual = 0;
int padding = 15;
for (int columnIndex = 0; columnIndex < getColumnCount(); columnIndex++) {
int width = 50; // Min width
TableColumn column = columnModel.getColumn(columnIndex);
for (int row = 0; row < getRowCount(); row++) {
TableCellRenderer renderer = getCellRenderer(row, columnIndex);
Component comp = prepareRenderer(renderer, row, columnIndex);
width = Math.max(comp.getPreferredSize().width + padding, width);
}
if (columnIndex < getColumnCount() - 1) {
column.setPreferredWidth(width);
cumulativeActual += column.getWidth();
} else { //LAST COLUMN
//Use the parent's (viewPort) width and subtract the previous columbs actual widths.
column.setPreferredWidth((int) getParent().getSize().getWidth() - cumulativeActual);
}
}
}
每次添加行时都调用resizeColumnWidth()。
(可选)向表中添加一个侦听器,以便在调整表本身大小时也调整列的大小:
public MyCustomJTable() {
super();
addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
@Override
public void ancestorResized(HierarchyEvent e) {
super.ancestorResized(e);
resizeColumnWidth();
}
});
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}