使用AbstractTableModel的Jtable删除所有Row

时间:2018-01-19 20:08:40

标签: java jtable abstracttablemodel

我尝试在添加新行之前删除Jtable的所有行。但由于某种原因,我无法删除一行。

在ModelDynamiqueObjet中,我定义了所有覆盖方法,然后添加了两个方法,一个用于添加对象,另一个用于删除对象。

我成功添加了几个对象,但是当我尝试删除arraylist的某个对象时,我失败了。 这是我的AbstractModel类:

public class ModeleDynamiqueObjet extends AbstractTableModel {
private ArrayList<Meteo> meteos ;
private String[] entetes = {"Date", "Temps", "Temperature", "Vent", "Humidité", "Nuage"};


public ModeleDynamiqueObjet() {
    super();
    meteos = new ArrayList<Meteo>();
}

@override methods....

public void addRow(Meteo meteo) {
    meteos.add(meteo);
    fireTableRowsInserted(meteos.size() -1, meteos.size() -1);
}

public void removeRow(int index){
    meteos.remove(index);
    fireTableRowsDeleted(index,index);

}

}

这是我的观点:

public class Fenetre extends JFrame implements Observer, ActionListener {
private JTextField adresseField;
private ModeleDynamiqueObjet model;
private JTable tableau;
private JScrollPane scrollPane;

private Controller controller = null;

public Fenetre(Controller controller) {
    super("Ma météo");
    this.controller = controller;

    GraphicsEnvironment.getLocalGraphicsEnvironment();
    this.setSize(800,800);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());
    model = new ModeleDynamiqueObjet();
    tableau = new JTable(model);
    scrollPane = new JScrollPane(tableau);
    getContentPane().add(new JScrollPane(scrollPane), BorderLayout.CENTER);
    this.setVisible(true);
}

@Override
public void update(Observable o, Object arg) {

    if(o instanceof MeteoAPI ){
        MeteoAPI meteoAPI = (MeteoAPI) o;
        ArrayList<Meteo> meteos = new ArrayList<Meteo>(meteoAPI.getMeteos());

        for(int i =0 ; i < model.getRowCount(); i++){
            model.removeRow(i);
        }

        for (Meteo meteo : meteos) {
            model.addRow(meteo);
        }

         this.setVisible(true);
    }
} }

如果有人能告诉我我做错了什么。谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

您的循环必须是反向的,因为最后的索引将不可用,因为您删除了以前的索引并且计数小于'i'。

另外,更容易:

而不是调用每个removeRow(应该反向工作)

TravelerName:[[["Jonathan       (Jonny)", "Doe", "Lewis", ""], ["Mary", "Doe", "L", ""] ]]

只需清除模型中的列表,将其添加到TableModelImplClass

即可
for (int i = model.getRowCount() - 1; i >= 0; i--)

然后调用它而不是循环