gpt4 book ai didi

java - 如何阻止 JTable 中的列按宽度调整大小?

转载 作者:行者123 更新时间:2023-12-01 18:41:34 24 4
gpt4 key购买 nike

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

我在这里实例化 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()。这可确保 boolean 列呈现为复选框。

接下来我尝试设置 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();
}
}

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

谢谢!

最佳答案

In method structureChanged() I call method fireTableStructureChanged(). This ensures that boolean columns are rendered as check boxes. (and...............) But this doesn't work, those columns are still resized and with wrong width?

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

JTable.setAutoCreateColumnsFromModel(boolean)

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

引用:

  1. public void fireTableStructureChanged()

关于java - 如何阻止 JTable 中的列按宽度调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19776372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com