当 "隐藏 "和 "显示 "列时,JTable会重复列。

问题描述 投票:1回答:1

我目前正在使用一个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();
        }

Image 1

Image 2

enter image description here

java jtable
1个回答
0
投票

你通过使用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(…) 方法。

© www.soinside.com 2019 - 2024. All rights reserved.