0

我想防止列被调整为大于 10px。我希望它很小,因为它只包含复选框。

我在这里实例化 JTable:

private void initDataSearchResultTable()
    {
        dataSearchResultTable = new JTable();
        dataSearchResultTable.setSelectionBackground(new Color(0xaaaaff));
        dataSearchResultTable.setFillsViewportHeight(true);
        dataSearchResultTable.setRowSelectionAllowed(true);
        dataSearchResultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        dataSearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    }

我在这里为表格设置表格模型(当用户单击按钮时):

void updateDataSearchTableModel(CachedRowSet cachedRowSet)
    {
        TableModel tableModel = dataSearchResultTable.getModel();
        if (tableModel instanceof DataSearchTableModel) {
            ((DataSearchTableModel) tableModel).updateModel(cachedRowSet);
        } else {
            tableModel = new DataSearchTableModel(cachedRowSet);
            dataSearchResultTable.setModel(tableModel);
            this.setCellRendererForDataSearchTable();
            ((DataSearchTableModel) tableModel).structureChanged();
        }
    }

在方法 structureChanged() 中,我调用方法 fireTableStructureChanged()。这可确保布尔列呈现为复选框。

接下来,我尝试设置 0 和 1 列的宽度并使其可调整大小。它不起作用:

private void setCellRendererForDataSearchTable()
    {
        DataSearchResultTableCellRenderer cellRenderer = new DataSearchResultTableCellRenderer();
        TableColumnModel columnModel = dataSearchResultTable.getColumnModel();
        for (int i = 0; i < columnModel.getColumnCount(); i++) {
            TableColumn column = columnModel.getColumn(i);
            if (i == 0) {
                column.setMaxWidth(15);
                column.setResizable(false);
            } else if (i == 1) {
                column.setMaxWidth(30);
                column.setResizable(false);
            }
            column.setCellRenderer(cellRenderer);
        }
    }

我的渲染器只为选定的单元格设置边框。我的表格模型更有趣:

public DataSearchTableModel(CachedRowSet cachedRowSet)
    {
        this.cachedRowSet = cachedRowSet;
        updateModel(this.cachedRowSet);
    }

    public void updateModel(CachedRowSet cachedRowSet)
    {
        try {
            metaData = this.cachedRowSet.getMetaData();
            this.numOfCols = metaData.getColumnCount();
            // Retrieve the number of rows.
            this.cachedRowSet.beforeFirst();
            this.numOfRows = 0;
            while (this.cachedRowSet.next()) {
                this.numOfRows++;
            }
            this.cachedRowSet.beforeFirst();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

但这不起作用,那些列仍然调整大小并且宽度错误?

谢谢!

4

3 回答 3

4

在方法 structureChanged() 中,我调用方法 fireTableStructureChanged()。这可确保布尔列呈现为复选框。(和......)但这不起作用,那些列仍然调整大小并且宽度错误?

通过JTable.setModel(model)调用或接收到由函数调用触发的事件fireTableStructureChanged,if autoCreateColumnsFromModelisset(true) JTable丢弃在这些函数调用之前拥有的任何表列,并按照它们在模型中出现的顺序重新分配默认列。这意味着您之前为该列设置的所有与列(宽度、渲染器等)相关的选项都将丢失。将autoCreateColumnsFromModel标志设置为false应该就足够了。要设置或取消设置此标志,请使用:

JTable.setAutoCreateColumnsFromModel(boolean)

或者,您可能需要在这些函数调用之后将所有选项重置为列。

参考:

  1. 公共无效fireTableStructureChanged()
于 2013-11-05T05:20:36.453 回答
1

您可以使用:

public void resizeColumn(JTable tbl, int column) {
  tbl.getColumnModel().getColumn(column).setPrefferedSize(new Dimension(/*width*/, /*height*/));
}
于 2013-11-05T12:32:33.660 回答
-1

我找到了解决方案。

在自定义 TableColumns 之后,您永远不应该调用 fireTableStructureChanged。但是要在设置模型和渲染器后更新表,您需要 fireTableStructureChanged。

因此,首先设置单元格渲染器,然后调用 fireTableStructureChanged 以使布尔列显示为复选框,然后才更改您的 TableColumns。

它会起作用的。

于 2013-11-05T09:33:08.547 回答