动态变化JTable标题

时间:2014-10-08 12:25:05

标签: java swing jtable jtableheader

我有一张显示一年数据的表格。该表可以对每列具有不同的周期,例如几周,两周,几个月。我希望改变所显示的年份。我设法让表数据和标题改变,但是表的结构丢失了。

该表的设置如下:

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

}

它给我一个这样的布局:

enter image description here

我有以下代码来改变年份:

private void changeYears() {
    modGen.setYear(boxYears.getSelectedIndex()+1);
    modGen.fireTableStructureChanged();
    panMid.revalidate();
}

表模型(modGen)获取年份并根据年份返回getColumnName和getValueAt中的相应数据。

当我使用它时,结果是:

enter image description here

表格列宽度丢失,第0列的渲染器似乎已被删除。如果我使用fireTableDataChanged,标题不会改变,但数据会改变。使用fireTableStructureChanged会改变标题,但会失去所述的结构。

有什么想法吗?

1 个答案:

答案 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);
  }
}