我有一张显示一年数据的表格。该表可以对每列具有不同的周期,例如几周,两周,几个月。我希望改变所显示的年份。我设法让表数据和标题改变,但是表的结构丢失了。
该表的设置如下:
public class GenerateTable extends JTable {
private class RenderSelect extends JComponent implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if ((row & 1)==0) {
JCheckBox boxTemp = new JCheckBox();
boxTemp.setSelected((boolean)value);
return boxTemp;
}
else
return new JTextField(" ");
}
}
RenderSelect objRender = new RenderSelect();
public GenerateTable(GenerateTableModel model) {
super(model);
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/*
* Select
*/
TableColumn colSelect = this.getColumnModel().getColumn(0);
colSelect.setPreferredWidth(70);
colSelect.setMinWidth(40);
colSelect.setCellRenderer(objRender);
colSelect.setCellEditor(new DefaultCellEditor(new JCheckBox()));
/*
* category
*/
this.getColumnModel().getColumn(1).setResizable(false);
this.getColumnModel().getColumn(1).setPreferredWidth(200);
this.getColumnModel().getColumn(1).setMinWidth(100);
/*
* Amount values
*/
for (int i=2;i<model.getColumnCount();i++) {
colSelect = this.getColumnModel().getColumn(i);
colSelect.setPreferredWidth(80);
colSelect.setMinWidth(80);
colSelect.setResizable(false);
}
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
}
它给我一个这样的布局:
我有以下代码来改变年份:
private void changeYears() {
modGen.setYear(boxYears.getSelectedIndex()+1);
modGen.fireTableStructureChanged();
panMid.revalidate();
}
表模型(modGen)获取年份并根据年份返回getColumnName和getValueAt中的相应数据。
当我使用它时,结果是:
表格列宽度丢失,第0列的渲染器似乎已被删除。如果我使用fireTableDataChanged,标题不会改变,但数据会改变。使用fireTableStructureChanged会改变标题,但会失去所述的结构。
有什么想法吗?
答案 0 :(得分:2)
您必须在更改标题值
时更新列模型JTable table = new JTable(modGen);
//...
modGen.setYear(boxYears.getSelectedIndex()+1);
for (int i = 0; i < modGen.getColumnCount(); i++) {
String name = modGen.getColumnName(i);
int viewIdx = table.convertColumnIndexToView(i);
if (viewIdx >= 0) {
table.getColumnModel().getColumn(viewIdx).setHeaderValue(name);
}
}