AbstractTableModel を拡張する jtable があります。選択したセルの行と列を取得する 2 つの ListSelectionListeners を登録しました。ただし、モデルで定義された updateData() メソッドを呼び出し、それが fireTableDataChanged() メソッドを呼び出すと、2 つの ListSelectionListeners がトリガーされ、行と列の値 -1 が取得されます。これは、それらを使用してインデックスを作成する場合の例外です。fireTableDataChanged() メソッドが 2 つのリスナーをトリガーするのを防ぐ方法はありますか? または、モデルに登録されているすべてのリスナーをトリガーせずにテーブル データを更新する他の方法はありますか?
コードは次のとおりです。
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");
}
}
}
ご協力いただきありがとうございます