我目前正在使用一个JTable来显示一些病人的详细信息。我有一个JCheckBox,当勾选时,它会在表中添加一个新的列,并将数据添加到新的列中。当它被取消勾选时,它应该删除该列,有点像在表中添加额外的过滤器。但是,当我取消勾选后再次勾选时,它却重复了表中的列。
我试着使用fireTableStructureChanged()方法,但它永远不会更新表,所以即使取消勾选,列也会留在那里。但如果我把它删除,那么当我取消勾选复选框时,它就会工作,但随后重复的问题又出现了。我粘贴了我的actionPerformed()方法,用于勾选复选框时。第一张图是我点击复选框之前的表格。第二张是当我点击复选框并添加列的时候。最后第三张是当我取消勾选复选框并再次勾选的时候。任何帮助都将是非常感激的。
@Override
public void actionPerformed(ActionEvent e)
{
if (gui.getChkCholesterol().isSelected() == true)
{
try {
gui.getRightTableModel().addColumn("Cholesterol");
newColumnIndeces.put("2093-3",gui.getRightTable().getColumnCount()-1);
gui.getRightTableModel().addColumn("Cholesterol Effective Date/Time");
newColumnIndeces.put("2093-3e",gui.getRightTable().getColumnCount()-1);
if(gui.getRightTable().getRowCount()>0)
{
int columnNumberValue = newColumnIndeces.get("2093-3");
int columnNumberDate = newColumnIndeces.get("2093-3e");
for (int i = 0; i<gui.getRightTable().getRowCount(); i++)
{
String value = op.getPatientObservationValue(gui.getRightTable().getValueAt(i,0).toString(),"2093-3");
String date = op.getPatientObservationEffectiveDate(gui.getRightTable().getValueAt(i,0).toString(),"2093-3");
gui.getRightTableModel().setValueAt(value, i, columnNumberValue);
gui.getRightTableModel().setValueAt(date, i, columnNumberDate);
}
}
} catch (ParseException parseException) {
parseException.printStackTrace();
}
setCellColourForTable();
timer.schedule(new RefreshTable(), 0, seconds);
}
else
{
gui.getRightTable().removeColumn(gui.getRightTable().getColumnModel().getColumn(newColumnIndeces.get("2093-3")));
gui.getRightTable().removeColumn(gui.getRightTable().getColumnModel().getColumn(newColumnIndeces.get("2093-3e")-1));
newColumnIndeces.remove("2093-3");
newColumnIndeces.remove("2093-3e");
timer.cancel();
timer = new Timer();
}
gui.getRightTableModel().fireTableStructureChanged();
}
你通过使用JCheckBox向模型中添加一列。
gui.getRightTableModel().addColumn("Cholesterol");
这将通知视图数据已经改变,表也将更新。
但是,您使用以下方法从表中删除该列。
gui.getRightTable().removeColumn(…);
这只是将列从 "表视图 "中删除。列没有从 "表视图 "中删除。DefaultTableModel
. 所以下次你添加一列时,它就会被添加到后面的 DefaultTableModel
.
因此,解决方案是将该列从。DefaultTableModel
,而不是表。
不幸的是,没有 removeColumn(…)
方法。
然而,由于你的要求是只从结尾处添加remove列。DefaultTableModel
您可以使用。
model.setColumnCount(model.getColumnCount() - 2);
这将有效地从模型中删除最后两列。
另一个选择是不要继续向DefaultTableModel中添加列,而只需添加remove TableColumns
来自 TableColumnModel
直接显示。所以这意味着Cholestoral列的数据将始终在模型中,但视图将不显示列。
所以,与其使用 model.addColumn(…)
你会使用 table.addColumn(…)
方法。