2013-10-23 351 views
1

我有一个扩展AbstractTableModel的一个JTable我ListSelectionListener总是被触发。我注册了两个ListSelectionListeners,它们获取所选单元格的行和列。然而,当我打电话其中又调用fireTableDataChanged()方法模型中定义的了updateData()方法,两个ListSelectionListeners被触发,他们得到的行和列值-1,这是一个异常时,我用它们来索引。反正是有防止fireTableDataChanged()方法来触发两个监听器?还是有没有其他方法可以更新表格数据而不触发注册到模型的所有监听器?为什么当fireTableDataChanged()方法被调用

下面是代码:

public class MonthTableModel extends AbstractTableModel { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
//private int currentYear, currentMonth; 
private String[] columnName = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; 

@Override 
public int getColumnCount() { 
    // TODO Auto-generated method stub 
    return 7; 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return 6; 
} 

    public void updateData(int y, int m) 
{ 
    /** 
      do something to change the data of the table 
      */ 
    fireTableDataChanged(); 
} 
public String getColumnName(int column) 
{ 

    return columnName[column]; 
} 
@Override 

public Object getValueAt(int row, int column) { 
    // TODO Auto-generated method stub 
    if ((row >= 0 && row < 6) && (column < 7 && column >= 0)) 
     return "CalendarDate"; 
    return ""; 
} 


public boolean isCellEditable(int row, int col) 
    { 
     return false; 
    } 

TabelMonthModel jTableMonthTable = new TableMonthModel(); 

SelectionListener listener = new SelectionListener(jTableMonthTable); 

jTableMonthTable.getSelectionModel().addListSelectionListener(listener); 
     jTableMonthTable.getColumnModel().getSelectionModel().addListSelectionListener(listener); 


class SelectionListener implements ListSelectionListener { 
     JTable jtable; 
     public RowSelectionListener(JTable j) 
     { 
      jtable = j; 
     } 
     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      // TODO Auto-generated method stub 
        if (!e.getValueIsAdjusting()) 
        { 
      int rowIndex = jtable.getSelectedRow(); 
      int colIndex = jtable.getSelectedColumn(); 
      System.out.println("row: " + rowIndex + "\n"); 
         System.out.println("col: " + colIndex + "\n"); 
        } 
     } 


    } 

感谢您的帮助

回答

1

两个ListSelectionListeners被触发,他们得到的行和列值-1,这是一个异常时,我用它们来索引

我想事件得到生成,因为你删除所有的数据,所以选择需要设置为-1指示没有单元格ar再次选择。

您的代码应该检查-1,不做处理。

另一种选择是你调用的updateData()方法之前删除监听,然后添加监听器模型已经被更新了。

相关问题