Java Swing:尝试隐藏和显示 JTable 的列不适用于动态宽度

Java Swing: Trying to hide and show JTable's column doesn't work with dynamic width

我正在尝试创建一个具有动态宽度(根据列中最大的元素)的 JTable,并且我正在使用 this 代码

JTable table = new JTable(){
    @Override
       public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
           Component component = super.prepareRenderer(renderer, row, column);
           int rendererWidth = component.getPreferredSize().width;
           TableColumn tableColumn = getColumnModel().getColumn(column);
           tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
           return component;
        }
    };
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

动态宽度工作正常,但我有一个事件侦听器来检查复选框(1 个复选框 = 1 列),如果它们未被选中,该列应该被隐藏,如果它们再次被选中,该列应该重新-出现。为此,我正在使用:

if (jCheckBox.isSelected())
{
    table.getColumn(columnName).setMinWidth(15);
    table.getColumn(columnName).setMaxWidth(2147483647);
    table.getColumn(columnName).setWidth(100);
}
else
{
    table.getColumn(columnName).setMinWidth(0);
    table.getColumn(columnName).setMaxWidth(0);
    table.getColumn(columnName).setWidth(0);
}

这段代码运行完美,但我认为这一行:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

破坏了功能,现在,隐藏列有效,但重新出现无效。你知道可能是什么问题吗?谢谢!

改变

table.getColumn(columnName).setWidth(0);

table.getColumn(columnName).setPreferredWidth(0);

当您隐藏栏时 table 焦点仍然在栏上。通过自定义 Jtable class

上的覆盖方法修复它
@Override
public void changeSelection(int row, int col, boolean bln, boolean bln1) {
    int max = getColumnModel().getColumn(col).getMaxWidth();
    if (max != 0) {
        super.changeSelection(row, col, bln, bln1);
    } else {
        int nextCol = col + 1;
        int nextRow = row + 1;
        if (col == getColumnCount() - 1) {
            nextCol = 0;
        }
        if (row == getRowCount() - 1) {
            nextRow = 0;
        }
        changeSelection(nextRow, nextCol, bln, bln1);
    }
}