Java DefaultTableModel-删除行更新向量,不添加

Java DefaultTableModel-删除行更新向量,不添加,java,vector,jtable,defaulttablemodel,Java,Vector,Jtable,Defaulttablemodel,事情是这样的。我的框架中有一个JTable,显示一些可以编辑的数据。可以添加新行,也可以删除旧行 现在,如果我从一个填充了一些数据的表开始,它工作得很好。我可以删除行,这也可以从我的数据Vector中删除行。但是,当我添加一行时,该行会显示在我的表中,但更改不会反映在数据中 Vector<Object> newQuestion = new Vector<Object>(3, 1); newQuestion.add(question.getText()); newQuest

事情是这样的。我的框架中有一个
JTable
,显示一些可以编辑的数据。可以添加新行,也可以删除旧行

现在,如果我从一个填充了一些数据的表开始,它工作得很好。我可以删除行,这也可以从我的数据
Vector
中删除行。但是,当我添加一行时,该行会显示在我的表中,但更改不会反映在数据中

Vector<Object> newQuestion = new Vector<Object>(3, 1);
newQuestion.add(question.getText());
newQuestion.add(answer.getText());
newQuestion.add(false);
model.addRow(newQuestion); // Update the model with new question

来自向量的第一个if数据。第二个是“模型”向量中的数据。为什么会这样?当我向现有表中添加某些内容时,文件行也会显示更改。

看看如何创建数据:

public Vector<Vector<Object>> convertMapToVector(Map<String, String> quesToAnsMap) {
    if (quesToAnsMap.size() > 0) {
        // the data field is initialized here
        data = new Vector<Vector<Object>>(quesToAnsMap.size(), 1); 
        ...
        return data;
    }
    // but not here
    return new Vector<Vector<Object>>();
}
public Vector convertMapToVector(Map quesToAnsMap){
if(quesToAnsMap.size()>0){
//数据字段在此初始化
数据=新向量(quesToAnsMap.size(),1);
...
返回数据;
}
//但不是在这里
返回新向量();
}
我的建议是使代码更加健壮:

  • 不要使用
    数据
    字段。因为数据已经包含在模型中,所以它没有用处。因此,要获取数据,只需从模型中获取数据
  • 要么让您的所有方法都接受参数和返回值,要么不接受任何内容,返回void,并初始化字段,但混合使用这两种方法会令人困惑。上面的方法初始化一个字段并返回它,但是else子句只返回它而不初始化它

数据中怎么可能没有反映出变化?您正在向模型中添加一行,因此它有了这一新行。证明是表格显示了它。什么是你执行的代码,而不是你认为它应该做的?您希望这段代码做什么,它会做什么呢?嗯,我需要向一个空表中添加行,然后将数据保存在文件中。当我在控制台上打印要调试的数据时,即使在添加行之后,它也显示为null。如果我试图将表保存到一个文件中,我会得到一个
NullPointerException
。代码高度依赖于我的其他类,因此很遗憾,我无法提供SSCCE。您提供的代码正在运行,因为数据显示在表中。你为什么不给我们看那些不需要的代码?NullPointerException附带堆栈跟踪、文件名和行号,因此您应该能够轻松识别非工作代码的位置以及问题所在。您是否尝试过在通过
model
将行添加到
JTable
后打印
model
的数据?@jbnize是,当我尝试将数据写入文件时会引发异常,因为数据为null。是的,我尝试在添加每一行后打印
向量
,但它只是空的。啊哈。。接球不错,先生!这就解决了!我仍然需要清理大部分代码,这只是一个原型。但谢谢你的建议。:)
public Vector<Vector<Object>> convertMapToVector(Map<String, String> quesToAnsMap) {
    if (quesToAnsMap.size() > 0) {
        // the data field is initialized here
        data = new Vector<Vector<Object>>(quesToAnsMap.size(), 1); 
        ...
        return data;
    }
    // but not here
    return new Vector<Vector<Object>>();
}