#java #swing #jtable #gesture-recognition
#java #swing #jtable #распознавание жестов
Вопрос:
Я работаю с JTable, который может иметь переменную высоту строк. Я также недавно добавил поддержку перетаскивания для моей 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. На случай, если вам интересно, единственная причина, по которой я это делаю, — это иметь детальный контроль над подсказками перетаскивания и перетаскиванием изображений.
Комментарии:
1. Я никогда не вижу, чтобы это работало для JTable, для JTree или JList с этим проблем нет
2. @mrKorbel: Я не уверен, что понимаю, что вы имеете в виду. Вы хотите сказать, что пакет java.awt.dnd не подходит для JTables с изменяемыми размерами строк?
3. да, я имею в виду, но это не результат для вас, может быть, кто-то знает, как изменить размер строки JTable другим способом,
4. если вы настаиваете на повторном изобретении колеса (да, я знаю — не совсем справедливо, поскольку Swing dnd spport не хватает более тонкого контроля, хотя и немного улучшен в jdk7 🙂 загляните в исходники BasicTableUI, чтобы увидеть, как там решается проблема (afair, они различаются задержкой)