Java 动态更改JTable头

Java 动态更改JTable头,java,swing,jtable,jtableheader,Java,Swing,Jtable,Jtableheader,我有一个表格显示一年的数据。表格中的每一列可以有不同的时段,例如周、两周、月。我希望更改显示的年份。我已经设法更改了表数据和标题,但是,表的结构丢失了 该表由以下内容设置: public class GenerateTable extends JTable { private class RenderSelect extends JComponent implements TableCellRenderer { @Override public Component getTab

我有一个表格显示一年的数据。表格中的每一列可以有不同的时段,例如周、两周、月。我希望更改显示的年份。我已经设法更改了表数据和标题,但是,表的结构丢失了

该表由以下内容设置:

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);
}
表模型(modGen)采用年份,并根据年份返回getColumnName和getValueAt中的相应数据

当我使用它时,结果是:

表列宽丢失,列0的渲染器似乎已删除。如果使用fireTableDataChanged,则标题不会更改,但数据会更改。使用fireTableStructureChanged确实会更改标头,但会如前所述释放结构


有什么想法吗?

您必须在更改标题值时更新列模型

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);
  }
}
JTable表=新的JTable(modGen);
//...
modGen.setYear(boxYears.getSelectedIndex()+1);
对于(int i=0;i=0){
table.getColumnModel().getColumn(viewIdx).setHeaderValue(name);
}
}

什么是modGen?显示
modGen.setYear(boxYears.getSelectedIndex()+1)方法。还显示
GenerateTableModel
的代码。读取,显示
table.setAutoCreateColumnsFromModel(false)解决您的问题。我已尝试获取标题并重新验证它:post for help.alex2410,我已按建议设置标志,标题不再更改。如果我发布MCVE,代码的大小将非常大,因为数据模型非常复杂。请添加关于将列索引从视图转换为模型的说明(以避免重新排序的错误)@mKorbel它已经在这里了:
int viewIdx=table.convertColumnIndexToView(I)
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);
  }
}