【发布时间】: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”。
标签: java swing user-interface resize jtable