我有一个JTable实现了TableModelListener,已经实现了tableChanged(TableModelEvent event)方法,但是我无法检测到正确的列。我在编辑第二列或特定列时得到col -1。

这是我对tableChanged(TableModelEvent event)方法的实现:

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








}

最佳答案

根据您的原始问题,我们应该如何猜测您使用的是自定义TableModel?这就是为什么您应该始终在问题中包含适当的SSCCE,以便我们不必猜测您可能在做什么或可能不在做什么。

为什么要使用自定义TableModel?无需创建自定义模型。 DefaultTableModel将执行您的自定义模型所执行的操作。

无论如何,问题确实出在您的自定义TableModel上:

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


您没有更改所有数据。您只更改了一个单元格的数据,因此触发了适当的事件。

07-24 14:30