动态将不可编辑的JTable行设置为可编辑 [英] Dynamically set non-editable JTable row as editable

查看:100
本文介绍了动态将不可编辑的JTable行设置为可编辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经扩展了AbstractTableModel类,使其JTable不可编辑,请期待第一行.顺便说一句,我已经覆盖了isCellEditable(int row,int col)方法.通过放置一个整数变量来保持nextRow激活,我让第一行尊重了我的条件.当用户填充上一行第零列中的单元格时(数据已更改,并且必须具有值),此框处于活动状态.到目前为止,这是我的代码.

I have extended the AbstractTableModel class to make my JTable non-editable,expects the first row. By the way, i have overrided the isCellEditable(int row, int col) methode.By putting an integer variable, that hold the nextRow to activate, i got the first row respects my creterias.So, the problem is to make the next row active when the the cell in previous row column zero is filled by the user (data changed and must have a value).Her is my code so far.

package MODEL.tableModel;

import MODEL.Produit;
import MODEL.ProduitInBonDachat;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;


public class BonDachatTableModel extends AbstractTableModel implements TableModelListener {

    private String headerTitle[] = {"Designation", "Qté", "Prix Unitaire", "Sous Total"};
    private List<ProduitInBonDachat> data;
// variable that hold the next 
    private int nextActiveRow = 0;

    public BonDachatTableModel() {
        data = new ArrayList<ProduitInBonDachat>();
    }

    @Override
    public String getColumnName(int i) {
        return headerTitle[i];
    }

    @Override
    public int getRowCount() {
        return 10;
    }

    @Override
    public int getColumnCount() {
        return headerTitle.length;
    }

    public void tableChanged(TableModelEvent event) {
        int col = event.getColumn();
        int fRow = event.getFirstRow();

        if ((col == 1) && (col == 2)) {
            setValueAt(getValueAt(fRow, col), fRow, col);
            fireTableCellUpdated(fRow, col);
        } 
    }

    public Object getValueAt(int row, int col) {
        try {
            data.get(row);
        } catch (IndexOutOfBoundsException e) {
            return null;
        }
        ProduitInBonDachat pInBonDachat = data.get(row);

        switch (col) {
            case 0:
                if (pInBonDachat.getDesignationProduit() == null) {
                    return null;
                }
                if(!pInBonDachat.getDesignationProduit().isEmpty()){
                     nextActiveRow++ ;
                fireTableCellUpdated(row, col);
                }

                return pInBonDachat.getDesignationProduit();
            case 1:
                if (pInBonDachat.getQte() == null) {
                    return null;
                }
                return pInBonDachat.getQte();
            case 2:
                if (pInBonDachat.getPrixDeVente() == null) {
                    return null;
                }
                return pInBonDachat.getPrixDeVente();
            case 3:
                if (pInBonDachat.getPrixDeVente() == null || pInBonDachat.getQte() == null) {
                    return null;
                }
                return pInBonDachat.getQte().multiply(pInBonDachat.getPrixDeVente());
            default:
                return null;

        }
    }



  public boolean isCellEditable(int row, int col) {
     if(col == 1 || col == 2 || row == nextActiveRow)
        return true; 
     else 
        return false ;

}

    @Override
    public void setValueAt(Object value, int row, int col) {
        ProduitInBonDachat tableEtry;
        try {
            tableEtry = data.get(row);
        } catch (IndexOutOfBoundsException e) {
            tableEtry = new ProduitInBonDachat();
            data.add(row, tableEtry);
        }

        switch (col) {
            case 0:
                tableEtry.setDesignationProduit((String) value);
                nextRowActive();
fireTableCellUpdated(int row, int col);
                break;
            case 1:
                tableEtry.setQte((BigDecimal) value);
                break;
            case 2:
                tableEtry.setPrixDeVente((BigDecimal) value);
                break;
            default:
                super.setValueAt(value, row, col);

        }

    }

    @Override
    public Class<?> getColumnClass(int col) {
        switch (col) {
            case 0:
                return String.class;
            case 1:
                return BigDecimal.class;
            case 2:
                return BigDecimal.class;
            case 3:
                return BigDecimal.class;
            default:
                return super.getColumnClass(col);
        }
    }

    public void nextRowActive(){
        nextActiveRow++;
     }



}

推荐答案

基本上,如果当前列不是0,则当前方法将返回false,否则,它将返回true

Basically, your current method will return false if the current column is not 0, otherwise it will return true

也许像...

public boolean isCellEditable(int row, int col) {
    boolean isEditable = false;
    System.out.println("update cell edittable");
    if(col != 0 && row == nextActiveRow){
        isEditable = true;
    }
    return isEditable;
}

会做得更好...

要更新nextActiveRow值,您需要验证当前行的有效性,并在适当时将其更新为变量,例如...

To update the nextActiveRow value, you need to verify the validity of the current row and update it the variable when it's appropriate, for example...

public void setValueAt(Object value, int row, int col) {
    ProduitInBonDachat tableEtry;
    try {
        tableEtry = data.get(row);

        switch (col) {
            case 0:
                tableEtry.setDesignationProduit((String) value);
                break;
            case 1:
                tableEtry.setQte((BigDecimal) value);
                break;
            case 2:
                tableEtry.setPrixDeVente((BigDecimal) value);
                break;
        }
        fireTableCellUpdated(row, col);
        if (row == nextActiveRow && activeRowIsVaid()) {
            nextRowActive();
        }
    } catch (IndexOutOfBoundsException e) {
        // IMHO, this is not an appropriate action for the
        // setValueAt method, as the contract suggest that you are
        // editing an existing row, instead provide a method in your model
        // which is responsible for inserting/adding new rows
        //tableEtry = new ProduitInBonDachat();
        //data.add(row, tableEtry);
        // don't forget to fireRowInserted!
    }

}

这篇关于动态将不可编辑的JTable行设置为可编辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆