2013-04-26 2 views
1

Я добавил к одному из JLists в моей программе java перегрузку перетаскивания. Я добавил метод к этому JList, чтобы иметь хороший эффект призрачного изображения выбранных значений, которые я перетаскиваю. Этот эффект работает прекрасно, пока я не добавить обработчик передачи:Перетаскивание объектов из JList с эффектом изображения призрака

В этом случае, этот метод:

myList.addMouseMotionListener(new MouseAdapter() { 
    public void mouseDragged(MouseEvent evt) { 
     System.out.println("Dragging");    
    } 
}); 

от:

import java.awt.*; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.*; 
import java.io.IOException; 
import java.util.ArrayList; 

import javax.activation.ActivationDataFlavor; 
import javax.activation.DataHandler; 
import javax.swing.*; 

class ListExample extends JFrame 
{ 

private JPanel  topPanel; 
private JList  myList; 

public ListExample() 
{ 

    setSize(300, 100); 
    topPanel = new JPanel(); 
    topPanel.setLayout(new BorderLayout()); 
    getContentPane().add(topPanel); 

    String listData[] = 
     { 
      "Item 1", 
      "Item 2", 
      "Item 3", 
      "Item 4" 
     }; 


    myList = new JList(listData); 
    myList.setDragEnabled(true); 
    ListItemTransferHandler handler = new ListItemTransferHandler(); 
    myList.setTransferHandler(handler); 
    topPanel.add(myList, BorderLayout.CENTER); 
    myList.addMouseMotionListener(new MouseAdapter() { 
     public void mouseDragged(MouseEvent evt) { 
      System.out.println("Dragging");    
     } 
    }); 
} 

public static void main(String args[]) 
{ 

    ListExample mainFrame = new ListExample(); 
    mainFrame.setVisible(true); 
} 
class ListItemTransferHandler extends TransferHandler { 
    private final DataFlavor localObjectFlavor; 
    private Object[] transferedObjects = null; 
    public ListItemTransferHandler() { 
     localObjectFlavor = new ActivationDataFlavor(Object[].class, DataFlavor.javaJVMLocalObjectMimeType, "Array of items"); 
    } 
    private JList source = null; 
    @SuppressWarnings("deprecation") 
    @Override protected Transferable createTransferable(JComponent c) { 
     source = (JList) c; 
     transferedObjects = source.getSelectedValues(); 
     return new DataHandler(transferedObjects, localObjectFlavor.getMimeType()); 
    } 
    @Override public boolean canImport(TransferSupport info) { 

     return true; 

    } 
    @Override public int getSourceActions(JComponent c) { 
     return MOVE; //TransferHandler.COPY_OR_MOVE; 
    } 



} 
} 

вызывается один или два раза, как я начинаю тянуть, но как только я получаю несколько пикселей, выбор источника меняет цвет, и мой прослушиватель перетаскивания больше не вызывается, а изображение-призрак остается рядом с источником перетаскиваемого объекта. Однако я все еще могу перетащить выделенные ячейки и сбросить их туда, где я хочу. Просто призрачное изображение не следует полностью. Мне явно не хватает чего-то важного здесь, но поскольку это довольно специфическая проблема, я нигде не мог найти помощь, поэтому предложения будут оценены.

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+1

Это может быть конкретное поведение (изображение-призрак) для вашей ОС, но не стандартная функция Java. Обычно для создания такого эффекта вам нужно будет сделать много дополнительного кодирования и приложить некоторые усилия в этом ... –

+0

Как это происходит, эта функция не поддерживается в Windows, и именно поэтому я хотел бы сделать ее индивидуальной. –

ответ

0

DragGestureListener taks приоритет на MouseMotionListener при запуске процесса Drag-n-Drop. Это вы должны реализовать такой DragGestureListener. См. Здесь хороший рабочий пример. Java drag and drop custom cursor

Смежные вопросы