Java JTable使用动态大小设置列宽,并将JTextArea设置为单元格渲染器
我想根据文本设置JTable列的动态大小。我想知道我设置为Java JTable使用动态大小设置列宽,并将JTextArea设置为单元格渲染器,java,swing,jtable,Java,Swing,Jtable,我想根据文本设置JTable列的动态大小。我想知道我设置为getColumnModel().getColumn(0)、setWidth(X)的每个X数字可以容纳多少个字符?(字体为Arial,字体大小为12) 我想知道我设置为getColumnModel().getColumn(0.setWidth(X)的每个X数;可以容纳多少个字符 您无法获得一般答案,因为字符串“iiiii”所占的像素数小于“wwwww”,因为每个字符所占的像素数不同 实际上,您需要单独确定每个单元格的大小,然后使用最大值。
getColumnModel().getColumn(0)、setWidth(X)的每个X
数字代码>可以容纳多少个字符?(字体为Arial,字体大小为12)
我想知道我设置为getColumnModel().getColumn(0.setWidth(X)的每个X数;可以容纳多少个字符
您无法获得一般答案,因为字符串“iiiii”所占的像素数小于“wwwww”,因为每个字符所占的像素数不同
实际上,您需要单独确定每个单元格的大小,然后使用最大值。您可以在数据加载到表中后执行此操作
基本准则是:
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 );
}
JTable表=新的JTable(…);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for(int column=0;column=最大宽度)
{
首选宽度=最大宽度;
打破
}
}
tableColumn.setPreferredWidth(preferredWidth);
}
上面的代码将为每列提供一个静态宽度
另一个选择是使用。表格列调整器
将上述逻辑与其他功能结合在一起,可用于确定列宽:
根据标题中的数据,每个单元格或两个单元格
静态(在数据加载到表格模型之后)或动态(在数据被编辑或添加到表格模型之后)
这就是您所需要的:
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);
表格将自动调整每一列的宽度以适应内容。无需控制何时触发调整大小。在渲染过程中不应更改组件的大小。您应该亲自尝试查看。它工作完美,我从来没有一个问题。这是目前为止满足这一需求的最佳解决方案。呈现代码的目的是呈现组件,而不是设置TableColumn的首选宽度。代码可能会处理从不更改的静态数据,在这种情况下,如果在加载数据后可以执行一次代码,则继续执行代码会增加开销。是的,如果数据更改,它会增加宽度,但不会减少宽度,因此列宽只能增加。根据要求,这可能是可以接受的。我有JTextArea
作为渲染器<代码>getIntercellSpacing()。宽度始终返回1