【问题标题】:Java Swing: Trying to hide and show JTable's column doesn't work with dynamic widthJava Swing:尝试隐藏和显示 JTable 的列不适用于动态宽度
【发布时间】:2021-06-06 20:47:31
【问题描述】:

我正在尝试创建一个具有动态宽度的 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);

动态宽度工作正常,但是我有一个事件侦听器到 chechboxes(1 chechbox = 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);

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

【问题讨论】:

  • 就个人而言,我不会试图通过缩小列来隐藏该列,而是将其从TableColumnModel 中物理删除。你可以看看Table Column Manager 一个例子
  • 我明白了,删除似乎很容易,但是如何将其添加回列?有没有办法记住它的位置(所以重新出现的列不会被添加到表格的末尾,而是在它消失的相同位置?谢谢@MadProgrammer
  • 有没有办法记住它的位置 - 该列出现在我的正确位置。发布您的minimal reproducible example 来证明问题。最后一个问题要求您提供“MRE”:stackoverflow.com/questions/66521467/…。每个问题都应包含“MRE”。
  • exampleexampleexample。基本思想是你有一个“可见”模型和一个“不可见”模型

标签: java swing user-interface resize jtable


【解决方案1】:

当您隐藏列时,表焦点窗台具有列。在您的自定义 Jtable 类上通过 Override Method 修复它

@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);
    }
}

【讨论】:

    【解决方案2】:

    改变

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

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

    【讨论】:

    • 哇,完美!非常感谢,如此简单的修复,完美运行
    • (1-) 如 cmets 中所建议,这不是隐藏列的方法。大小为 0 的列仍然是视图的一部分。如果用户从一列到另一列,“焦点”列将消失,用户会认为这是一个错误。正确的解决方案是从 TableColumnModel 中删除 TableColumn。
    • 如果你想从 tableColumnModel 中删除列,当你想再次显示它时会丢失数据检查我的下一个解决方案link
    猜你喜欢
    • 2014-01-21
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2012-10-31
    • 2013-02-02
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多