我想阻止列大小超过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();
}
}
但这不起作用,那些列仍然调整大小并且宽度错误?
谢谢!
答案 0 :(得分:4)
在方法structureChanged()中我调用方法 的 fireTableStructureChanged()即可。这确保了布尔列 呈现为复选框。 (和...............) 但这不起作用,这些列仍然调整大小并且有错误 宽度β
JTable.setModel(model)
致电或在收到 fireTableStructureChanged
函数调用触发的事件时,autoCreateColumnsFromModel
为set(true)
} JTable
将丢弃这些函数调用之前的所有表列,按照它们在模型中出现的顺序重新分配默认列。这意味着您之前设置到列的所有与列(宽度,渲染器等)相关的选项都将丢失。将autoCreateColumnsFromModel
标志设置为false
就足够了。要设置或取消设置此标志,请使用:
JTable.setAutoCreateColumnsFromModel(boolean)
或者,您可能需要在这些函数调用之后将所有选项重置为列。
参考:
答案 1 :(得分:1)
您可以使用:
public void resizeColumn(JTable tbl, int column) {
tbl.getColumnModel().getColumn(column).setPrefferedSize(new Dimension(/*width*/, /*height*/));
}
答案 2 :(得分:-1)
我找到了解决方案。
在自定义TableColumns之后,永远不应该调用fireTableStructureChanged。 但是要在设置模型和渲染器后更新表,您需要fireTableStructureChanged。
因此,首先设置单元格渲染器,然后调用fireTableStructureChanged以使用复选框替换布尔列,然后再更改TableColumns。
它会起作用。