Java 如何在JTable中阻止按宽度调整列的大小?
我想防止列的大小调整到大于10px。我希望它是小的,因为它只包含复选框 我在这里实例化JTable:Java 如何在JTable中阻止按宽度调整列的大小?,java,swing,jtable,Java,Swing,Jtable,我想防止列的大小调整到大于10px。我希望它是小的,因为它只包含复选框 我在这里实例化JTable: private void initDataSearchResultTable() { dataSearchResultTable = new JTable(); dataSearchResultTable.setSelectionBackground(new Color(0xaaaaff)); dataSearchResultTable.s
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);
}
我在这里为表格设置表格模型(当用户单击按钮时):
在方法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);
}
}
但这不起作用,那些列仍然调整了大小并且宽度错误
谢谢
在方法structureChanged()中,我调用方法
fireTableStructureChanged()。这可以确保布尔列是
呈现为复选框。
(和………)
但这不起作用,这些列的大小仍在调整,并且带有错误的
宽度
使用JTable.setModel(model)
调用,或者在收到FireTablesStructureChanged
函数调用触发的事件时,如果autoCreateColumnsFromModel
已设置(true)JTable
将丢弃在这些函数调用之前的所有表列,并按照默认列在模型中的显示顺序重新分配它们。这意味着与先前设置为列的列(宽度、渲染器等)相关的所有选项都将丢失。将autoCreateColumnsFromModel
标志设置为false
就足够了。要设置或取消设置此标志,请使用:
JTable.setAutoCreateColumnsFromModel(boolean)
或者,在这些函数调用之后,您可能需要将所有选项重置为列
参考资料:
在方法structureChanged()中,我调用方法
fireTableStructureChanged()。这可以确保布尔列是
呈现为复选框。
(和………)
但这不起作用,这些列的大小仍在调整,并且带有错误的
宽度
使用JTable.setModel(model)
调用,或者在收到FireTablesStructureChanged
函数调用触发的事件时,如果autoCreateColumnsFromModel
已设置(true)JTable
将丢弃在这些函数调用之前的所有表列,并按照默认列在模型中的显示顺序重新分配它们。这意味着与先前设置为列的列(宽度、渲染器等)相关的所有选项都将丢失。将autoCreateColumnsFromModel
标志设置为false
就足够了。要设置或取消设置此标志,请使用:
JTable.setAutoCreateColumnsFromModel(boolean)
或者,在这些函数调用之后,您可能需要将所有选项重置为列
参考资料:
我找到了解决办法
在自定义TableColumns后,不应调用fireTableStructureChanged。
但要在设置了表的模型和渲染器后更新表,需要更改FireTableStructure
因此,首先设置单元格渲染器,然后调用fireTableStructureChanged以使布尔列显示为复选框,然后才更改TableColumns
它会起作用的。我找到了解决办法
在自定义TableColumns后,不应调用fireTableStructureChanged。
但要在设置了表的模型和渲染器后更新表,需要更改FireTableStructure
因此,首先设置单元格渲染器,然后调用fireTableStructureChanged以使布尔列显示为复选框,然后才更改TableColumns
它会起作用。您可以使用:
public void resizeColumn(JTable tbl, int column) {
tbl.getColumnModel().getColumn(column).setPrefferedSize(new Dimension(/*width*/, /*height*/));
}
您可以使用:
public void resizeColumn(JTable tbl, int column) {
tbl.getColumnModel().getColumn(column).setPrefferedSize(new Dimension(/*width*/, /*height*/));
}
将表的大小更改为
JTable.AUTO\u resize\u OFF
。您可能还想尝试设置列的实际宽度和首选宽度是的,这是一个很好的选项AUTo_RESIZE_OFF,但我只想根据标题的宽度将第一列和第二列设置为特定宽度。只有1和2列的宽度不能更改。可能您需要使用TableColumn c=new TableColumn();c、 可设置大小(假)代码>?有效………..问题可能(很可能)在于firTableStructureChanged()
call将表的大小更改为JTable.AUTO\u resize\u OFF
。您可能还想尝试设置列的实际宽度和首选宽度是的,这是一个很好的选项AUTo_RESIZE_OFF,但我只想根据标题的宽度将第一列和第二列设置为特定宽度。只有1和2列的宽度不能更改。可能您需要使用TableColumn c=new TableColumn();c、 可设置大小(假)代码>?有效………..问题可能(很可能)是firTableStructureChanged()
Call感谢回复,但如果我将autoCreateColumnsFromModel设置为false,我的jtable根本不会显示任何行。如果我只是删除fireTableStructureChanged(),则我的列具有正确的宽度且不可调整大小,但布尔列在没有复选框的情况下呈现为字符串true。@VolodymyrLevytskyi,您是否在初始化JTable
之后,尝试将自动创建列FromModel
设置为false?请,张贴一个简短的工作示例,再现您的问题,并将其附在您的答案中。我将研究它,因为TableModel是由来自我的db的cachedrowset构建的,所以放弃它比发布sscce更容易。谢谢你的帮助。我自己来解决。@VolodymyrLevytskyi,具体来说,首先创建模型实例,然后创建表实例表=新JTable(model)
然后执行table.setAutoCreateColumnsFromModel(false)代码>。在此之后,对模型的任何更改都不会有任何问题。如果它仍然不起作用,那么如果没有代码,我想我在这里不会有多大帮助:)谢谢您的回复,但是如果我将autoCreateColumnsFromModel设置为false,我的jtable将根本不显示任何行。如果我只是删除fireTableStructureChanged(),那么我的列的宽度就正确了,并且不可调整大小,但是布尔列在呈现时没有复选框