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

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

public abstract class AbstractTable extends AbstractTableModel{

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

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

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

РЕДАКТИРОВАТЬ:

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


person Heisenbug    schedule 07.06.2011    source источник


Ответы (4)


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

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

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

person trashgod    schedule 08.06.2011
comment
+1 ... Это должен быть 10-й пост о мусорном боге, который очень помог мне со Swing на этой неделе! - person The111; 23.01.2013
comment
@The111: Рад помочь; Я обновил ответ, чтобы прояснить различие между редактированием и обновлением. - person trashgod; 23.01.2013
comment
В первом примере зачем создавать два экземпляра ValueRenderer? - person Michael Starkie; 04.04.2017
comment
Один используется в качестве средства визуализации ячеек; другой обслуживает редактор ячеек. - person trashgod; 04.04.2017

Я не могу устоять перед советом @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); 
    //... 
 }
person mKorbel    schedule 07.06.2011

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

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

person jzd    schedule 07.06.2011
comment
Да я мог. В любом случае, я хотел бы знать, возможно ли это и как это сделать с помощью прослушивателя мыши. Я так делаю с тех пор. Мой класс модели таблицы немного сложен. Я хотел бы использовать прослушиватель мыши, чтобы избежать действия, которое я хочу выполнить при изменении статуса, от самой модели таблицы. В частности, я хотел бы избежать размещения логики внутри setValue. Спасибо, в любом случае - person Heisenbug; 07.06.2011
comment
+1 Пользовательский редактор и средство визуализации — правильный путь. Я описал пример здесь. - person trashgod; 08.06.2011

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

Приветствую!...

person Ordiel    schedule 23.07.2013