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

Java 如何在JTable中阻止按宽度调整列的大小?,java,swing,jtable,Java,Swing,Jtable,我想防止列的大小调整到大于10px。我希望它是小的,因为它只包含复选框 我在这里实例化JTable: private void initDataSearchResultTable() { dataSearchResultTable = new JTable(); dataSearchResultTable.setSelectionBackground(new Color(0xaaaaff)); dataSearchResultTable.s

我想防止列的大小调整到大于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);
    }
我在这里为表格设置表格模型(当用户单击按钮时):

在方法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(),那么我的列的宽度就正确了,并且不可调整大小,但是布尔列在呈现时没有复选框