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);
}
}
我正在尝试创建一个具有动态宽度(根据列中最大的元素)的 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);
}
}