2015-01-03 16 views
0

Я расширил класс AbstractTableModel, чтобы сделать JTable недоступным для редактирования, ожидает первую строку. Кстати, я переопределил метод isCellEditable (int row, int col). Поместив целочисленную переменную, которая удерживает nextRow для активации, я получил первую строку, относящуюся к моим creterias.Таким образом, проблема состоит в том, чтобы сделать следующую строку активен, когда ячейка в предыдущем столбце нулевого нуля заполняется пользователем (данные изменены и должны иметь значение). На данный момент мой код.Динамически заданная нередактируемая строка JTable как редактируемая

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++; 
    } 



} 
+1

Просмотреть последнее «return true» в методе «isCellEditable»? Это означает, что если это не первый столбец, а не nextActiveRow, тогда ячейка будет доступна для редактирования ... – MadProgrammer

+0

Я изменил isCellEditable (int row, int col); methode, но моя проблема заключается в том, чтобы увеличивать следующую переменную nextActiveRow только тогда, когда ячейка in (nextActiveRow, 0) заполнена некоторым значением, поэтому nextActiveRow ++ становится редактируемым. –

+0

В этом случае, когда вызывается 'setValueAt', вам нужно сделать оценку правильности текущей строки и обновить' nextActiveRow' соответственно ... – MadProgrammer

ответ

2

В принципе, ваш текущий метод будет возвращать false, если текущий столбец не 0, в противном случае он будет возвращать 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, вам необходимо проверить правильность текущего строка и обновить его переменной, когда это уместно, к примеру ...

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! 
    } 

} 
+0

спасибо, что я получил работу. –

0

Вот решение, которое работает для меня, JTable, который активируется по строкам, когда первый столбец заполнен.

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; 
    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; 
       } 

       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 == 0 && row <= nextActiveRow) { 
      return true; 
     } 
     if (col == 1 && row <= nextActiveRow) { 
      return true; 
     } 
     if (col == 2 && row <= nextActiveRow) { 
      return true; 
     } 
     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: 
       String valueCast = (String) value; 
       if (valueCast.isEmpty()) { 
        break; 
       } 
       nextActiveRow++; 
       tableEtry.setDesignationProduit((String) value); 

       break; 
      case 1: 
       tableEtry.setQte((BigDecimal) value); 
       break; 
      case 2: 
       tableEtry.setPrixDeVente((BigDecimal) value); 
       break; 
      default: 
       super.setValueAt(value, row, col); 

     } 
     fireTableCellUpdated(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++; 
    } 

} 
Смежные вопросы