2015-01-05 2 views
1

У меня есть JTable witch реализует метод TableModelListener, я внедрил метод tableChanged (TableModelEvent), но я не могу определить правильный столбец, который был изменен. Я получил col -1, в то время как я редактирую второй или определенный столбец.JTable рассчитать сумму последнего столбца

Вот моя реализация tableChanged (событие TableModelEvent) Methode:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JDialog; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 
import javax.swing.table.AbstractTableModel; 


public class JTableTest extends JDialog{ 
    private JTable myTable ; 

    public JTableTest() { 
     super(); 

     myTable = new JTable(new myTableModel()); 
     getContentPane().add(new JScrollPane(myTable),BorderLayout.CENTER); 
     pack(); 
    } 

    class myTableModel extends AbstractTableModel implements TableModelListener{ 

     Object[][] donnees = { 
       {"Johnathan", "Sykes","Natation"}, 
       {"Nicolas", "Van de Kampf","FOOTBALL" }, 
       {"Damien", "Cuthbert","TENNIS" }, 
       {"Corinne", "Valance","NATATION"}, 
       {"Emilie", "Schrödinger","FOOTBALL"}, 
       {"Delphine", "Duke","TENNIS"}, 
       {"Eric", "Trump","TENNIS"}, 
     }; 

     String[] entetes = {"Prénom", "Nom","SPORT"}; 

     public myTableModel() { 
      addTableModelListener(this); 
     } 

     public int getRowCount() { 
     return donnees.length; 

    } 

    public int getColumnCount() { 
     return entetes.length; 
    } 

    public String getColumnName(int columnIndex) { 
     return entetes[columnIndex]; 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     return donnees[rowIndex][columnIndex]; 
    } 

     @Override 
     public void tableChanged(TableModelEvent me) { 
      // I wanna get the right column not -1 
      System.out.println(me.getColumn()); 
      switch(me.getType()){ 
       case TableModelEvent.UPDATE: 
        System.out.println("Updating...");break; 
       case TableModelEvent.INSERT: 
        System.out.println("Inserting...");break; 
       case TableModelEvent.DELETE: 
        System.out.println("Delete...");break; 
       default :break ; 
      } 

     } 

     @Override 
     public void setValueAt(Object value, int row, int col) { 
      donnees[row][col] = (String) value; 
      fireTableDataChanged(); 
     } 


     @Override 
     public boolean isCellEditable(int row, int col) { 
      return true; 
     } 



} 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new JTableTest().setVisible(true); 
      } 
     }); 
    } 








} 
+0

Возвращает константу TableModelEvent.ALL_COLUMNS. Вы проверили event.getType(), чтобы убедиться, что вы получаете ОБНОВЛЕНИЕ? Если нет, тогда оберните свой код в if или switch. – sprinter

+0

Я добавил event.getType(), я получил обновление, но event.getColumn() все еще возвращает -1, в то время как я меняю активный столбец (1 или 2) –

+0

Не могли бы вы добавить код создания таблицы? Я вообще создал JTables, используя подкласс AbstractTableModel, который позволяет вам переопределить setValue. Я нахожу это проще, чем реагировать на события. – sprinter

ответ

2

на основе оригинального вопроса, как мы должны предположить, что вы используете пользовательское TableModel? Вот почему вы должны всегда включать правильный SSCCE с вопросом, поэтому нам не нужно угадывать, что вы можете или не можете делать.

Почему вы используете пользовательский TableModel? Нет необходимости создавать пользовательскую модель. DefaultTableModel будет делать то, что делает ваша пользовательская модель.

Во всяком случае, проблема действительно с пользовательской TableModel:

//fireTableDataChanged(); 
fireTableCellUpdated(row, col); 

Вы не изменить все данные. Вы только изменили данные одной ячейки, чтобы запустить соответствующее событие.

+0

Нет, это просто симуляция моей реальной проблемы. Я настроил модель таблицы, чтобы сделать ячейки доступными для редактирования, разрешить пользователю добавлять строку, ведь объект не является строковым типом .... и т. Д. –

+0

@abdouamer, все это можно сделать с помощью DefaultTableModel. Вы переопределяете метод isCellEditable (...), вы не создаете целый новый класс. – camickr

+0

Вы имеете в виду, что мне нужно расширить метод DefaultTableModel? –

0

BigDecimal.add(BigDecimal) Метод возвращает BigDecimal. Он не переназначает значение.

Вы должны использовать следующий код для переназначения somme значения:

somme = somme.add((BigDecimal) getValueAt(i, 3)); 
+0

ОК, я исправил это, но это не является проблемой для этой записи, я хочу обнаружить, когда значение третьего столбца было обновлено. –

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