呈现JTable后调用方法:是否有onRenderFinished事件?

时间:2016-12-23 07:55:53

标签: java swing jtable

基本上:我的JTable每行需要特殊的行高。使用的每个渲染器将每个单元格的请求行高写入表中的映射,该表具有方法updateRowHeights,该方法使用映射来设置行高。问题是具有行高的地图仅由渲染器填充高度。因此,第一次渲染表时,地图仍然是空的。因此,当第一次没有设置行高时显示表格。

作为一个不那么漂亮的解决方法,我在我的表中添加了一个组件监听器,用于更新行高。这在大多数情况下都可以正常工作,但是例如当表格位于tabbedpane内的滚动窗格中时不会调用它。我最好有一个方法onRenderingFinished或类似的方法,我可以在其中调用行高法。

我正在做How to set the RowHeight dynamically in a JTable的第一个回答。在那里提到你不应该在渲染器内改变你的表的行高(我同意这一点),并且在初始化完成后你设置它(调用updateRowHeight)一次,无论何时何地它所依赖的国家的情况发生了变化。"

所以我的问题是:我在何时/何时致电updateRowHeight

是否有一个事件告诉我渲染器已完成?

1 个答案:

答案 0 :(得分:2)

如果您只想更新依赖于最高单元格高度的表格行高度,则只需在设置表格内容后调用此方法。

public static void updateRowHeight(JTable table, int margin) {
    final int rowCount = table.getRowCount();
    final int colCount = table.getColumnCount();
    for (int i = 0; i < rowCount; i++) {
        int maxHeight = 0;
        for (int j = 0; j < colCount; j++) {
            final TableCellRenderer renderer = table.getCellRenderer(i, j);
            maxHeight = Math.max(maxHeight, table.prepareRenderer(renderer, i, j).getPreferredSize().height);
        }
        table.setRowHeight(i, maxHeight + margin);
    }
}

保证金是可选参数,为每一行提供额外的空间(可以是0或正数)。

请注意:当表格非常大和/或包含大量HTML字符串时,此方法可能会引发性能问题。