JTable 在 "Hiding" 和 "Showing" 时复制列
JTable Duplicates Columns when "Hiding" and "Showing" them
我目前正在使用 JTable 来显示一些患者详细信息。我有一个 JCheckBox,勾选后会向 table 添加一个新列并将数据添加到新列。当它未被选中时,它应该删除该列,有点像向 table 添加额外的过滤器。但是,当我取消选中后再次选中该框时,它会复制 table 中的列。
我尝试使用 fireTableStructureChanged() 方法,但它永远不会更新 table,因此即使未选中复选框,列也会保留在那里。但是如果我删除它,那么当我取消选中它的复选框时它会起作用,但是重复问题又回来了。当勾选复选框时,我粘贴了我的 actionPerformed() 方法。在单击复选框之前,第一张图片是我的 table。第二个是当我单击复选框并添加该列时。最后第三个是当我取消勾选复选框并再次勾选时。任何帮助将不胜感激。
@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();
}
您使用以下方法向模型添加一列:
gui.getRightTableModel().addColumn("Cholesterol");
这将通知视图数据已更改,table 也将更新。
但是,您使用以下方法从 table 中删除了该列:
gui.getRightTable().removeColumn(…);
这只会从 "table view" 中删除该列。该列尚未从 DefaultTableModel
中删除。因此,下次您添加一列时,它只会添加到 DefaultTableModel
.
的末尾
所以解决方案是从 DefaultTableModel
中删除列,而不是 table。
遗憾的是没有removeColumn(…)
方法。
但是因为您的要求是 DefaultTableModel
末尾的 add/remove 列,您可以使用:
model.setColumnCount(model.getColumnCount() - 2);
这将有效地从模型中删除最后两列。
另一种选择是不继续向 DefaultTableModel 添加列,而是您可以直接从 TableColumnModel
add/remove TableColumns
。所以这意味着 Cholestoral 列的数据将始终在模型中,但视图不会显示这些列。
因此,您可以使用 table.addColumn(…)
方法,而不是使用 model.addColumn(…)
。
我目前正在使用 JTable 来显示一些患者详细信息。我有一个 JCheckBox,勾选后会向 table 添加一个新列并将数据添加到新列。当它未被选中时,它应该删除该列,有点像向 table 添加额外的过滤器。但是,当我取消选中后再次选中该框时,它会复制 table 中的列。
我尝试使用 fireTableStructureChanged() 方法,但它永远不会更新 table,因此即使未选中复选框,列也会保留在那里。但是如果我删除它,那么当我取消选中它的复选框时它会起作用,但是重复问题又回来了。当勾选复选框时,我粘贴了我的 actionPerformed() 方法。在单击复选框之前,第一张图片是我的 table。第二个是当我单击复选框并添加该列时。最后第三个是当我取消勾选复选框并再次勾选时。任何帮助将不胜感激。
@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();
}
您使用以下方法向模型添加一列:
gui.getRightTableModel().addColumn("Cholesterol");
这将通知视图数据已更改,table 也将更新。
但是,您使用以下方法从 table 中删除了该列:
gui.getRightTable().removeColumn(…);
这只会从 "table view" 中删除该列。该列尚未从 DefaultTableModel
中删除。因此,下次您添加一列时,它只会添加到 DefaultTableModel
.
所以解决方案是从 DefaultTableModel
中删除列,而不是 table。
遗憾的是没有removeColumn(…)
方法。
但是因为您的要求是 DefaultTableModel
末尾的 add/remove 列,您可以使用:
model.setColumnCount(model.getColumnCount() - 2);
这将有效地从模型中删除最后两列。
另一种选择是不继续向 DefaultTableModel 添加列,而是您可以直接从 TableColumnModel
add/remove TableColumns
。所以这意味着 Cholestoral 列的数据将始终在模型中,但视图不会显示这些列。
因此,您可以使用 table.addColumn(…)
方法,而不是使用 model.addColumn(…)
。