Как я могу отключить выбор jtable ячейки с помощью мыши и перетаскивания - PullRequest
4 голосов
/ 02 февраля 2012

Я хочу использовать JTable, но с другим методом выбора ячеек вместо щелчка по ячейкам.Я использую стеклянную панель, чтобы позволить пользователям рисовать прямоугольник, и обнаруживаю, какие ячейки содержатся в прямоугольнике для выбора.Но я хочу выбрать ячейку, только если она полностью находится внутри прямоугольника.Например, представьте простую таблицу 3 х 3.Пользователь может выбрать среднюю ячейку (1,1).Я хочу, чтобы они могли щелкнуть в первой ячейке 0,0 и перетащить вниз в ячейку 2,2, рисуя прямоугольник для выбора.Но я не хочу выделять ячейки 0,0 или 2,2.Или выберите все 9, если уж на то пошло.Это упрощенный пример.Рисование прямоугольника может фактически охватывать ячейки из более чем одной таблицы на экране.

Я рассмотрел реализацию интерфейса ListSelectionModel, но на самом деле не хочу пытаться переписать это.Экспериментируя, я увидел, что setSelectionInterval () в модели вызывается как сумасшедший (для каждого движения мыши), когда я щелкаю и перетаскиваю в таблице.Что мне действительно хотелось бы, так это найти простой способ отключить любой слушатель / механизм на столе, который выполняет вызовы к SelectionModel, при этом сохраняя модель на месте.Я все еще хотел бы, чтобы это сообщило isSelectedIndex () например.Я бы сказал модели, какие интервалы выбраны.

Я подумал, что где-то есть адаптер ввода мыши, встроенный в JTables?Я хотел бы выключить его, если это возможно.

Спасибо, BBB

1 Ответ

3 голосов
/ 02 февраля 2012

Для общего / текстового вопроса вы получите общий текстовый ответ. :) Начните с удаления MouseListeners, установленных в таблице по умолчанию:

MouseListener[] listeners = myTable.getMouseListeners();
for (MouseListener l : listeners)
{
    myTable.removeMouseListener(l);
}

Затем добавьте свой собственный MouseListener в таблицу (используйте MouseAdapter, если хотите) и переопределите методы "mousePressed" / "mouseReleased", чтобы записать точки, где началось перетаскивание, и перетаскивание закончилось. Определите вмещающий прямоугольник и вызовите:

setRowSelectionInterval(#, #)
setColumnSelectionInterval(#,#)

для выбора одной (или нескольких) ячеек.

...