как добавить слушателя мыши в ячейку JTable, содержащую логическое значение, отображаемое как флажок - PullRequest
6 голосов
/ 07 июня 2011

У меня есть JTable с пользовательской моделью, реализованной с расширением AbstractTableModel.

public abstract class AbstractTable extends AbstractTableModel{

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

Поскольку я реализовал метод getColumnClass, логические значения отображаются в таблице как флажки. Я хотел бы перехватить изменение статуса флажка, но, к сожалению, я не могу добавить непосредственно прослушиватель мыши, потому что у меня нет ссылки на сам флажок, который я не создал.

Как настроить прослушиватель мыши на перехват события изменения состояния флажка?

EDIT:

@ JZD ответ правильный. Я могу поймать изменение в методе setValue. Но я хотел бы знать, как реализовать подход, основанный на использовании слушателя мыши.

Ответы [ 4 ]

6 голосов
/ 08 июня 2011

В частности, я хотел бы избежать помещения логики внутрь setValue().

В этом примере выбираемых значений метод setValue() не переопределяется, , за исключением обновления внутренней структуры данных и запуска соответствующего события . ValueEditor расширяет AbstractCellEditor и реализует ItemListener, тогда как ValueRenderer расширяет JCheckBox. Таким образом, редактор может прослушивать JCheckBox рендерера внутри itemStateChanged() редактора.

Добавление: добавление CellEditorListener - это еще один подход, показанный здесь для JTree. Обратите внимание, что JTable само по себе является CellEditorListener.

5 голосов
/ 08 июня 2011

Я не могу устоять перед советом @jzd, на самом деле нет, я думаю, что нет, не гарантирует, что я пойду через TableMode#setValue,

но в основном есть два варианта

1) TableModelListener

2) Только AFAIK TableCellEditor # isCellEditable может делать это в соединениях с JCheckBox или JRadioButton в JTable

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); 
    //... 
 }
3 голосов
/ 07 июня 2011

Похоже, добавление слушателя мыши - это дополнительный шаг. Я бы предложил перехватить изменение метода setValue() модели.

Если вы не можете изменить метод setValue(), то следующая лучшая вещь - это CustomEditor, которая блокирует изменения, потому что это не очень хороший способ отловить и скрыть щелчок мыши даже в булевом редакторе по умолчанию.

0 голосов
/ 23 июля 2013

У меня возникла точно такая же проблема, и я также знаю, что вы специально просили прослушиватель мыши для редактора флажков, но временным решением может быть добавление TableModelListener, как описано здесь в разделе «Прослушивание изменений данных» и попытайтесь смоделировать поведение при обнаружении изменения, но если вы хотите знать, когда указатель мыши находится над флажком или тому подобное <конкретные действия мыши>, я боюсь, что вы Вам придется сделать собственную реализацию редактора ячеек, который реализует такое поведение ... По крайней мере, это то, что я бы сделал ...

Grettings! ... * * 1006

...