JTable 设置具有动态大小的列宽和 JTextArea 作为单元格渲染器
JTable set column width with a dynamic size and JTextArea as cell renderer
我想根据文本设置动态大小的 JTable 列。我想知道我设置为 getColumnModel().getColumn(0).setWidth(X);
的每个 X
数字可以容纳多少个字符? (字体为 Arial 字体大小为 12 )
I want to know for each X number I set to getColumnModel().getColumn(0).setWidth(X); how many characters can fit in?
您无法获得一般答案,因为字符串 "iiiii" 将占用少于 "wwwww",因为每个字符占用的像素数不同。
相反,您实际上需要单独确定每个单元格的大小,然后使用最大值。您将在数据加载到 table 后执行此操作。
基本代码为:
JTable table = new JTable( ... );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
for (int column = 0; column < table.getColumnCount(); column++)
{
TableColumn tableColumn = table.getColumnModel().getColumn(column);
int preferredWidth = tableColumn.getMinWidth();
int maxWidth = tableColumn.getMaxWidth();
for (int row = 0; row < table.getRowCount(); row++)
{
TableCellRenderer cellRenderer = table.getCellRenderer(row, column);
Component c = table.prepareRenderer(cellRenderer, row, column);
int width = c.getPreferredSize().width + table.getIntercellSpacing().width;
preferredWidth = Math.max(preferredWidth, width);
// We've exceeded the maximum width, no need to check other rows
if (preferredWidth >= maxWidth)
{
preferredWidth = maxWidth;
break;
}
}
tableColumn.setPreferredWidth( preferredWidth );
}
以上代码将为每列提供一个静态宽度。
另一种选择是使用Table Column Adjuster。 Table Column Adjuster
将上述逻辑与附加功能结合在一起,可用于确定列宽:
- 基于 header、每个单元格或两者中的数据
- 静态(在数据加载到
TableModel
之后)或动态(当数据被编辑或添加到 TableModel
时)。
这就是您所需要的:
JTable table = new JTable(){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component component = super.prepareRenderer(renderer, row, column);
int rendererWidth = component.getPreferredSize().width;
TableColumn tableColumn = getColumnModel().getColumn(column);
tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
return component;
}
};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table 将自动调整每个列的宽度以适应内容。无需控制何时触发调整大小。
我想根据文本设置动态大小的 JTable 列。我想知道我设置为 getColumnModel().getColumn(0).setWidth(X);
的每个 X
数字可以容纳多少个字符? (字体为 Arial 字体大小为 12 )
I want to know for each X number I set to getColumnModel().getColumn(0).setWidth(X); how many characters can fit in?
您无法获得一般答案,因为字符串 "iiiii" 将占用少于 "wwwww",因为每个字符占用的像素数不同。
相反,您实际上需要单独确定每个单元格的大小,然后使用最大值。您将在数据加载到 table 后执行此操作。
基本代码为:
JTable table = new JTable( ... );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
for (int column = 0; column < table.getColumnCount(); column++)
{
TableColumn tableColumn = table.getColumnModel().getColumn(column);
int preferredWidth = tableColumn.getMinWidth();
int maxWidth = tableColumn.getMaxWidth();
for (int row = 0; row < table.getRowCount(); row++)
{
TableCellRenderer cellRenderer = table.getCellRenderer(row, column);
Component c = table.prepareRenderer(cellRenderer, row, column);
int width = c.getPreferredSize().width + table.getIntercellSpacing().width;
preferredWidth = Math.max(preferredWidth, width);
// We've exceeded the maximum width, no need to check other rows
if (preferredWidth >= maxWidth)
{
preferredWidth = maxWidth;
break;
}
}
tableColumn.setPreferredWidth( preferredWidth );
}
以上代码将为每列提供一个静态宽度。
另一种选择是使用Table Column Adjuster。 Table Column Adjuster
将上述逻辑与附加功能结合在一起,可用于确定列宽:
- 基于 header、每个单元格或两者中的数据
- 静态(在数据加载到
TableModel
之后)或动态(当数据被编辑或添加到TableModel
时)。
这就是您所需要的:
JTable table = new JTable(){
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component component = super.prepareRenderer(renderer, row, column);
int rendererWidth = component.getPreferredSize().width;
TableColumn tableColumn = getColumnModel().getColumn(column);
tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
return component;
}
};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table 将自动调整每个列的宽度以适应内容。无需控制何时触发调整大小。