6

AbstractTableModel を拡張するカスタム モデルが実装された JTable があります。

public abstract class AbstractTable extends AbstractTableModel{

     public Class<? extends Object> getColumnClass(int c) {}
}

getColumnClass メソッドを実装したので、ブール値はチェックボックスのように表に表示されます。チェックボックスのステータスの変更を傍受したいのですが、残念ながら、私が作成したものではないチェックボックス自体への参照がないため、マウスリスナーを直接追加することはできません。

チェックボックスのステータス変更イベントをインターセプトするようにマウスリスナーを設定するにはどうすればよいですか?

編集:

@jzdの答えは正しいです。setValue メソッドで変更をキャッチできます。しかし、マウスリスナーベースのアプローチを実装する方法を知りたいです。

4

4 に答える 4

6

特に、内部にロジックを入れることは避けたいと思いsetValue()ます。

この選択可能な値の例では、内部データ構造を更新して適切なイベントを発生させることを除いてsetValue()、メソッドはオーバーライドされません。extendsと implements 、extends . このようにして、エディタはエディタの 内のレンダラーをリッスンできます。ValueEditorAbstractCellEditorItemListenerValueRendererJCheckBoxJCheckBoxitemStateChanged()

補遺: を追加することCellEditorListenerは別のアプローチであり、ここではJTree. JTableそれ自体が であることに注意してくださいCellEditorListener

于 2011-06-08T00:34:45.437 に答える
5

私は@jzdのアドバイスに抵抗することはできませんTableMode#setValue

しかし基本的に2つのオプションがあります

1)TableModelListener

2)AFAIKのみTableCellEditor#isCellEditableは、JTableのJCheckBoxまたはJRadioButtonとの接続でこれを実行できます。

public boolean isCellEditable(EventObject getEvent) {
    MouseEvent me = (MouseEvent) getEvent;
    JTable table = (JTable) (me.getSource());
    Point point = me.getPoint();
    int column = table.columnAtPoint(point);
    int row = table.rowAtPoint(point);
    Rectangle rec = table.getCellRect(row, column, true); 
    //... 
 }
于 2011-06-07T21:56:10.997 に答える
3

Seems like adding a mouse listener is an extra step. I would suggest intercepting the change in the setValue() method of the model.

If you can't change the setValue() method then the next best thing is a CustomEditor that will block changes because this is not a good way to catch and hide the mouse click even from the default boolean editor.

于 2011-06-07T19:14:28.400 に答える