2012-01-17 2 views
7

Windowsエクスプローラから外部ファイルをアプリケーションにドラッグして外部ファイルをインポートしたいスイングアプリケーションがあります。私はこの基本的な機能が働いています。しかし、デフォルトのドラッグ・アンド・ドロップ・カーソル・アイコンをアプリケーションの適切なカーソルに変更したいと思います。私はマウスのキーが押され、アプリケーションの上に保持されている間、ユーザーに見えるカーソルを変更することができませんでした。ドラッグアンドドロップ操作が同じスイングアプリケーション内にある場合、この作業の例を見てきました。 DragGestureListenerとDragSourceを使用してこれを達成しようとしましたが、役に立たないです。ドラッグ元がスイング内になければ、これらのメソッドは呼び出されないようです。スイングアプリケーションに外部ファイルをドラッグするときにドラッグカーソルを変更することはできますか?これはコメントしていない答えていたはずですが、コメントで収まるようにあまりにも長いです:外部ファイルをSwingアプリケーションにドラッグするときのカスタムカーソルの設定

public class DnDTemplate extends JFrame { 

private static final long serialVersionUID = 1L; 
private JComponent thePane = null; 
private Cursor dropCursor = null; 

public DnDTemplate() { 
    super("Drop File Here"); 

    thePane = (JComponent) getContentPane(); 
    thePane.setTransferHandler(new DndTransferHandler()); 

    ImageIcon imageIcon = new ImageIcon("drop_here.gif"); 
    Image image = imageIcon.getImage();  
    BufferedImage bufferedImage = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(image, 0, 0, null); 
    dropCursor = Toolkit.getDefaultToolkit().createCustomCursor(bufferedImage, new Point(16, 16), "drop cursor"); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(300, 300); 
} 

public static void main(String[] args) { 
    new DnDTemplate().setVisible(true); 
} 

class DndTransferHandler extends TransferHandler { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public boolean canImport(TransferHandler.TransferSupport info) { 
     // This gets called repeatedly while dragged file is over frame 
     if (!info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { 
      return false; 
     } 
     // Even though this method is called at the appropriate time, 
     // setting the cursor here is of no consequence 
     info.getComponent().setCursor(dropCursor); 

     return true; 
    } 

    @Override 
    public boolean importData(TransferHandler.TransferSupport info) { 
     // this gets called when file is dropped 
     if (!info.isDrop()) { 
      return false; 
     } 

     Transferable transferable = info.getTransferable(); 
     String importFileName = null; 
     try { 
      List<File> fileList = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor); 
      Iterator<File> iterator = fileList.iterator(); 
      while (iterator.hasNext()) { 
       File f = iterator.next(); 
       importFileName = f.getAbsolutePath(); 
      } 
      info.getComponent().setCursor(dropCursor); 
      thePane.setCursor(dropCursor); 

     } catch (Exception e) { 
      return false; 
     } 

     System.out.println("Importing " + importFileName); 
     // Return the cursor back to the default 
     thePane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     return true; 
    } 

} 

}

+6

いいえ、これは質問に答えませんでした。私は以前これを見て、setDropTargetの使用を試みました。 dragEnterメソッドは適切な時に呼び出されますが、カーソルはデフォルトのドラッグ・ドロップ・アイコンのままで、指定したドラッグ・ドロップ・アイコンには変わりません。 – agility

+0

私はdragOverにカーソルをセットしようとしましたが、http://bugs.sun.com/view_bug.do?bug_id=4451328に記載されているちらつきを経験しました。結局のところ固定ではないかもしれません。 – tenorsax

答えて

1

免責事項:

この単純化された例を参照してください。この回答は完全に間違っていると削除されます

私はこれをテストしませんでしたが、TransferHandlerのAPIを見て、TransferHandler#getDragImageメソッドを見てみることをお勧めします。

TransferHandlerが設定されているコンポーネントからドラッグが開始されたときにこの画像が使用されるか、またはアプリケーションの外部からドラッグが開始されてカーソルがコンポーネントにはTransferHandlerが設定されています。私は

Bug ID 4816922TransferHandler#getVisualRepresentationを使用することを示唆して外部アプリケーションからのドラッグ&ドロップについて、これは確かに、Javaアプリケーションで動作示唆しているようだan example、まだ決定的が見つかりましたが、バグがすでに固定されているかどうかは不明です。

+2

私は私の質問で指定する必要がありますが、Java 6のソリューションを探しています。これはJava 7でのみ実装されています。さらに、このソリューションをTransferHandler.setDragImageを使用してテストすると、呼び出しは無視され、 setDragImageの呼び出しの有無にかかわらず同じです。 – agility

関連する問題