1

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


    }

ご協力いただきありがとうございます

4

1 に答える 1

1

2 つの ListSelectionListeners がトリガーされ、行と列の値 -1 が取得されます。これは、それらを使用してインデックスを作成する場合の例外です。

すべてのデータを削除するため、イベントが生成されると思います。そのため、セルが選択されていないことを示す -1 に設定する必要があります。

コードは -1 をチェックし、処理を行わない必要があります。

もう 1 つのオプションは、updateData() メソッドを呼び出す前にリスナーを削除し、モデルの更新後にリスナーを追加することです。

于 2013-10-23T03:43:03.783 に答える