330
Chapter 9
C H A P T E R N I N E
Drag-and-Drop
Hacks 65–69
Several years ago, the Swing team introduced a pair of APIs for data trans-
fer:
java.awt.datatransfer and java.awt.dnd (Drag and Drop). The former
abstracts the concept of data exchange to and from your application (partici-
pating with either Java or native applications) and provides clipboard-based
copy-and-paste functionality. The latter particularizes these abstractions to
the specifics of drag-and-drop behavior. While many developers use these
APIs for working with unstyled clipboard text only, you can do much more.
Both Drag and Drop events and the clipboard support images,
URLs, Files,
and even custom Java objects.
H A C K
#65
Drag-and-Drop with Files Hack #65
Drag files from your application directly to the desktop, complete with
translucent icons.
This hack shows you how to go much further than mere clipboard access by
digging into the lower levels of the Drag and Drop APIs and building a pro-
gram that can save files directly to the desktop via dragging, complete with
proper file icons and drag feedback.
When you use an editor to write a large document, you often save it to a
particular location on your filesystem—in a Projects folder perhaps. This is
because you will keep the file around for a long time, so you want to store it
for later use. Small documents, however, are often created for transient rea-
sons. I often write a few paragraphs and then immediately post it to a
weblog or attach it to an email. Some applications (particularly those on
Mac OS X) let you save something quickly by dragging a small marker into
another application or the desktop. The marker represents the file and lets
you quickly move the entire file into another context (a blog editor, for
example) without thinking about where to save the file (and trying to
remember where you stashed it 10 minutes later).
Drag-and-Drop with Files #65
Chapter 9, Drag-and-Drop
|
331
HACK
Since drag-to-save behavior is not a standard part of the Java platform, you
will have to build it from scratch using the Drag and Drop APIs. First, you
will need a class that can trigger the drop action. The plan is to detect the
gesture, create a temp file to be saved, and then start the real drag with the
appropriate cursor and user feedback. Here’s a starting point:
class FileDragGestureListener extends DragSourceAdapter
implements DragGestureListener {
JTextArea text;
Cursor cursor;
public FileDragGestureListener(JTextArea text) {
this.text = text;
}
The FileDragGestureListener implements DragGestureListener and extends
the
DragSourceAdapter. Swing sends all drag events to a DragSource listener.
Extending the DragSourceAdapter, instead of implementing
DragSource directly, lets your class avoid implementing all of
the required methods.
DragSourceAdapter gives you empty,
no-op implementations of all the methods in
DragSource.
FileDragGestureListener accepts a component to grab the text from. Any
provider of text would work, but I chose a
JTextArea because it’s the most
likely to be used in a text editor.
All operating systems define a drag gesture, which usually means something
like “click and drag for more than 10 pixels,” though it varies from platform
to platform. Swing will detect the drag gesture and send an event to a
DragGestureListener, which is why FileDragGestureListener also imple-
ments that interface.
DragGestureListener defines one method:
dragGestureRecognized( ). This is where the real work of this hack is done:
public void dragGestureRecognized(DragGestureEvent evt) {
try {
// generate the temp file
File proxy_temp = File.createTempFile("tempdir",".dir",null);
File temp = new File(proxy_temp.getParent( ),"myfile.txt");
FileOutputStream out = new FileOutputStream(temp);
out.write(text.getText().getBytes( ));
out.close( );
The implementation of dragGestureRecognized( ) starts by creating a temp
file to store the text. Actually, first it creates a fake temp file,
proxy_temp,
using the
File.createTempFile( ) method. Then it creates the real temp file
in the same directory and writes the text data to the file. You could skip the
proxy_temp part, but then if the user drags to the desktop, he will end up

Get Swing Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.