繁体   English   中英

编辑时,Jtable将不保存单元格的数据

[英]Jtable will not save data of the cell when editing

我有一个表可编辑的JTable。 它应该获取Integer值并更新表。 但是,当我编辑一个单元格并转到另一个单元格时,数据将被擦除并返回空值,但程序不会引发任何异常。 我该如何解决?

public class FoodListPanel extends JPanel{
JTable jTable;
FoodTableModel fm;

public FoodListPanel() {

    try {
         fm = new FoodTableModel(FoodDAO.getAllFoodsFromDB(), new ArrayList<Integer>());

        jTable = new JTable(fm) {

            public boolean isCellEditable(int data, int columns) {
               if(columns<5){
                   return false;
               }
               else if(columns ==5){
                   return true;
               }
                else if(columns ==6){

                  if(getValueAt(data, 5)==Boolean.FALSE){
                      return false;
                  }
                   else {
                      return true;
                  }
               }
                else{
                   return true;
               }
            }

            public Component prepareRenderer(TableCellRenderer r, int data, int columns) {
                Component c = super.prepareRenderer(r, data, columns);
                return c;
            }


        };


        jTable.setPreferredScrollableViewportSize(new Dimension(650, 420));
        jTable.setFillsViewportHeight(true);

        JScrollPane jScrollPane = new JScrollPane(jTable);

        add(jScrollPane);

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

class FoodTableModel extends AbstractTableModel {
    protected String[] cols = {"نام‌غذا", "دسته‌بندی", "قیمت", "توضیحات", "عکس" , "تعداد"};
    protected Class[] colClasses = {String.class, Integer.class, String.class, String.class,
    JLabel.class, Integer.class};
    ArrayList<Food> al;
    ArrayList<Integer> vals;
    public FoodTableModel(ArrayList<Food> foods, ArrayList<Integer> val) {
        al = new ArrayList<Food>();
        al.addAll(foods);


        vals = new ArrayList<Integer>(al.size());

        vals.addAll(val);

    }


    ////// TODO: 8/20/16 make dynamic from DB
    public int getColumnCount (){return cols.length;}
    public int getRowCount (){return al.size();}
    public String getColumnName(int col) { return cols[col]; }
    public Class getColumnClass(int col) { return colClasses[col]; }

    public Object getValueAt(int row, int col){
        switch (col) {

            case 0:
                return al.get(row).getName();
            case 1:
                return al.get(row).getType();
            case 2:
                return al.get(row).getPrice();
            case 3:
                return al.get(row).getDiscreption();
            case 5:
                if(vals.size()>= al.size()) return vals.get(row);

            default:
                return null;
        }
    }

    ////https://stackoverflow.com/questions/39066012/index-out-of-bound-exception-when-setting-value-to-jtable
    public void setValueAt(Object vlaue, int row, int column){
       if (column==6){
            this.vals.set(row, (Integer)vlaue);
        }
        this.fireTableCellUpdated(row, column);
        this.fireTableDataChanged();

    }

    /*public void setCols(String[] columns){
        cols = columns;
    }
    public void setClasses(Class[] classes){
        colClasses = classes;
    }*/
}
}

数据将删除并返回空

您的getValuaAt(..)setValueAt()方法不同步。

setValueAt() ,仅保存第6列的数据。

getValueAt()您仅返回第0-5列的数据,并返回第6列的null。

您需要修复getValueAt(...)方法以返回实际数据,而不是null。

同样, setValueAt(...)方法应仅调用fireTableCellUpdated(...)方法,而不应调用fireTableDataChanged(...)方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM