如何确定JTable中的哪些列可见

时间:2015-09-08 09:31:30

标签: java swing jtable

我根据以下数据调整了我的列的大小:

  /**
   * 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隐藏列,在那里的某个地方,它会知道隐藏了哪些列,我可以获得该信息。)

2 个答案:

答案 0 :(得分:6)

检查table.convertColumnIndexToView(col)是否返回-1。

来自文档:

  

public int convertColumnIndexToView(int modelColumnIndex)

     

将modelColumnIndex表格模型中列的索引映射到   视图中列的索引。返回的索引   视图中对应的列;如果此列不是,则返回-1   正在显示。如果modelColumnIndex小于零,则返回   modelColumnIndex。

Source

答案 1 :(得分:3)

如果您的循环由TableMdoel中返回的值控制,则代码出现问题。

相反,您应该使用表中的值:

int rowCount = table.getRowCount();
int columnCount = table.getRowCount();

然后不需要异常逻辑来确定列是否可见,因为默认情况下它是可见的,因为视图(JTable)的作用只显示可见列。

您需要了解“视图”和“模型”之间的区别。

  

如何确定JTable中的哪些列可见

所以更好的答案是使用JTable的方法。您当前的解决方案会混淆视图和模型。

您也可以使用Table Column Adjuster为您进行色谱柱调整。它提供的功能包括在数据更改时动态调整列的大小。