Баг в JTable: теряется множественный selection при начале DnD

Пишу класс, перегружающий JTable, и снова вижу баг, который видел еще под JRE 1.4.2 году в 2006-м.

Ссылка на баг: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6195469.

Ошибка заключается в том, что, если в JTable выделить несколько ячеек и попытаться их перетащить (drag & drop), то, сразу же после нажатия кнопки мыши, selection сбрасывается со всех ячеек, кроме той, на которую непосредстенно нажали.

Воркараунд, приведенный по ссылке выше, по крайней мере в 1.6 не работает. Поэтому выкладываю свой класс FixedTableUI, которым можно подменить тот класс, который предлагается в воркараунде. Работает с 1.4 по 1.6 включительно:

/**
* This internal helper class helps to solve two bugs:
* The first is disable row selection with mouse drag
* The second is allow handling of multiple selected rows without need to
* hold a Shift key.
*/
private class FixedTableUI extends BasicTableUI {
private MouseInputHandler handler = new MouseInputHandler() {

private boolean isShiftDownInMousePressed = false;


public void mouseDragged(MouseEvent e) {
// Do nothing here!
}

public void mousePressed(MouseEvent e) {
isShiftDownInMousePressed = e.isShiftDown();
int row = rowAtPoint(e.getPoint());
if (!getSelectionModel().isSelectedIndex(row)) {
super.mousePressed(e);
} else {
if (e.isControlDown()) {
if (getSelectionModel().isSelectedIndex(row)) {
getSelectionModel().removeSelectionInterval(row, row);
}
}
}
}

public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
int row = rowAtPoint(e.getPoint());
int col = columnAtPoint(e.getPoint());
int[] selRows = getSelectedRows();
if (selRows.length > 0) {
if (!e.isControlDown() && !e.isShiftDown() &&
!isShiftDownInMousePressed) {
getSelectionModel().setSelectionInterval(row, row);
}
}
}
};

protected MouseInputListener createMouseInputListener() {
return handler;
}
}

0 коммент. | добавить комментарий :: Баг в JTable: теряется множественный selection при начале DnD

Отправить комментарий