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(…)