Запретить JTable с помощью DragGestureListener перехватывать перетаскивание мыши с изменением размера строки

#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, они различаются задержкой)