我根据以下数据调整了我的列的大小:
/**
* Set the widths of the columns in the table according to the data in the table.
* @param table
*/
private static void setColumnWidths(JTable table)
{
int columnCount = table.getModel().getColumnCount();
int rowCount = table.getModel().getRowCount();
TableColumnModel columnModel = table.getColumnModel();
for (int col=0; col<columnCount; col++)
{
TableColumn column = columnModel.getColumn(col);
TableCellRenderer renderer = column.getCellRenderer();
if (renderer == null)
{
renderer = new DefaultTableCellRenderer();
}
int overallColumnWidth = 0;
for (int row = 0; row < rowCount; row++)
{
Object value = table.getValueAt(row, col);
Component component = renderer.getTableCellRendererComponent(table, value, false, false, row, col);
int componentWidth = (int) component.getPreferredSize().getWidth();
overallColumnWidth = Math.max(componentWidth, overallColumnWidth);
}
column.setPreferredWidth(overallColumnWidth);
}
}
当所有列都可见时,这是有效的,但我有代码隐藏了其中的一些(JTable.removeColumn(TableColumn column)
)。似乎JTable实例和TableColumnModel实例都具有数据列列表,即所有列都与可见性无关。如何才能获得仅显示可见列的列表,或者测试给定列是否可见?
(我已经搜索了这个,但是获得了关于如何隐藏列的文章列表,并没有解释保存可见/不可见信息的位置。我想,因为我要求JTable隐藏列,在那里的某个地方,它会知道隐藏了哪些列,我可以获得该信息。)
答案 0 :(得分:6)
检查table.convertColumnIndexToView(col)
是否返回-1。
来自文档:
public int convertColumnIndexToView(int modelColumnIndex)
将modelColumnIndex表格模型中列的索引映射到 视图中列的索引。返回的索引 视图中对应的列;如果此列不是,则返回-1 正在显示。如果modelColumnIndex小于零,则返回 modelColumnIndex。
答案 1 :(得分:3)
如果您的循环由TableMdoel中返回的值控制,则代码出现问题。
相反,您应该使用表中的值:
int rowCount = table.getRowCount();
int columnCount = table.getRowCount();
然后不需要异常逻辑来确定列是否可见,因为默认情况下它是可见的,因为视图(JTable)的作用只显示可见列。
您需要了解“视图”和“模型”之间的区别。
如何确定JTable中的哪些列可见
所以更好的答案是使用JTable的方法。您当前的解决方案会混淆视图和模型。
您也可以使用Table Column Adjuster为您进行色谱柱调整。它提供的功能包括在数据更改时动态调整列的大小。