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