Я работаю с JTable, который может иметь переменную высоту строки.Я также недавно добавил поддержку Drag-and-drop для моей JTable, используя DragGestureListener для прослушивания событий перетаскивания и вызова «startDrag», если необходимо.
Проблема, с которой я столкнулся, заключается в том, что теперь даже движения мыши при изменении размера строки фиксируются интерфейсом DragGestureListener, и мне нужно найти способ отфильтровать жесты перетаскивания строк, которые также являются жестами изменения размера строк.Вот некоторый типичный код:
Class MyTable implements DragGestureListener
{
.
.
.
public void dragGestureRecognized(DragGestureEvent dge)
{
// Return early if selected row can't be dragged.
/* ====== Attempt to filter out row resize drags: Attempt 1 ======= */
if(getCursor().getType() == Cursor.N_RESIZE_CURSOR)
{
// Works, but does not seem robust.
return;
}
/* ====== Attempt to filter out row resize drags: Attempt 2 ======= */
// Get starting position of mouse drag and the cell bounds of the cell in the row being dragged.
Point dragStartPoint = dge.getDragOrigin();
Rectangle cellRect = getCellRect(dragStartPoint);
// Get mouse position relative to table.
Point mousePosition = MouseInfo.getPointerInfo().getLocation();
Point relativePosition = . . .; // calculate position relative to table.
if(Math.abs(relativePosition.y - cellRect.y) < 5)
{
// Filter out a drag operation within 5 pixels of cell boundary
// Seems to work, but is flaky, especially if row is resized quickly.
return;
}
.
.
.
dge.startDrag(DragSource.DefaultMoveDrop,
fDragImage,
new Point(5,5),
new StringSelection(""), // Transferable data
myDragSourceListener);
}
.
.
.
}
Теперь, Какой самый лучший / рекомендуемый / самый надежный способ отфильтровать перетаскивания с изменением размера строки из обычных перетаскиваний строки?
ПРИМЕЧАНИЕ: Вы также заметили, что я использую пакет java.awt.dnd для перетаскивания, а не интерфейс TransferHandler.Если вам любопытно, единственная причина, по которой я это делаю, - это иметь детальный контроль над перетаскиванием подсказок и перетаскиванием изображений.