Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable在出现“时复制列”;“隐藏”;及;“显示”;他们_Java_Swing_Jtable - Fatal编程技术网

Java JTable在出现“时复制列”;“隐藏”;及;“显示”;他们

Java JTable在出现“时复制列”;“隐藏”;及;“显示”;他们,java,swing,jtable,Java,Swing,Jtable,我目前正在使用JTable显示一些患者详细信息。我有一个JCheckBox,当勾选时,它会向表中添加一个新列,并向新列中添加数据。当它被取消勾选时,它应该删除该列,有点像向表中添加额外的过滤器。但是,当我在取消勾选后再次勾选该框时,它会复制表中的列 我尝试使用fireTableStructureChanged()方法,但它永远不会更新表,因此即使取消选中复选框,列也会保留在那里。但是如果我删除它,那么当我取消选中复选框时,它会工作,但是复制问题又回来了。选中复选框时,我粘贴了actionPerf

我目前正在使用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();
        }
@覆盖
已执行的公共无效操作(操作事件e)
{
if(gui.getChkCholesterol().isSelected()==true)
{
试一试{
gui.getRightTableModel().addColumn(“胆固醇”);
newColumnIndeces.put(“2093-3”,gui.getRightTable().getColumnCount()-1);
gui.getRightTableModel().addColumn(“生效日期/时间”);
newColumnIndeces.put(“2093-3e”,gui.getRightTable().getColumnCount()-1);
如果(gui.getRightTable().getRowCount()>0)
{
int columnNumberValue=newColumnIndeces.get(“2093-3”);
int columnNumberDate=newColumnIndes.get(“2093-3e”);

对于(int i=0;i您可以使用以下命令向模型中添加一列:

gui.getRightTableModel().addColumn("Cholesterol");
这将通知视图数据已更改,表也将更新

但是,可以使用以下方法从表中删除该列:

 gui.getRightTable().removeColumn(…);
这只会从“表视图”中删除该列。该列尚未从
DefaultTableModel
中删除。因此,下次添加列时,它只会添加到
DefaultTableModel
的末尾

因此,解决方案是从
DefaultTableModel
中删除列,而不是从表中删除列

不幸的是,没有
removeColumn(…)
方法

但是,由于您的要求是仅在
DefaultTableModel
的末尾添加/删除列,因此您可以使用:

model.setColumnCount(model.getColumnCount() - 2);
这将有效地从模型中删除最后两列

另一个选项是不继续向DefaultTableModel添加列,而是可以直接从
TableColumnModel
中添加/删除
TableColumns
。因此这意味着胆甾体列的数据将始终在模型中,但视图不会显示列

因此,您将使用
table.addColumn(…)
方法,而不是使用
model.addColumn(…)
方法