DragSourcepublic class DragSource extends Object implements SerializableThe DragSource is the entity responsible
for the initiation of the Drag
and Drop operation, and may be used in a number of scenarios:
- 1 default instance per JVM for the lifetime of that JVM.
- 1 instance per class of potential Drag Initiator object (e.g
TextField). [implementation dependent]
- 1 per instance of a particular
Component , or application specific
object associated with a Component
instance in the GUI. [implementation dependent]
- Some other arbitrary association. [implementation dependent]
Once the DragSource is
obtained, a DragGestureRecognizer should
also be obtained to associate the DragSource
with a particular
Component .
The initial interpretation of the user's gesture,
and the subsequent starting of the drag operation
are the responsibility of the implementing
Component , which is usually
implemented by a DragGestureRecognizer .
When a drag gesture occurs, the
DragSource 's
startDrag() method shall be
invoked in order to cause processing
of the user's navigational
gestures and delivery of Drag and Drop
protocol notifications. A
DragSource shall only
permit a single Drag and Drop operation to be
current at any one time, and shall
reject any further startDrag() requests
by throwing an IllegalDnDOperationException
until such time as the extant operation is complete.
The startDrag() method invokes the
createDragSourceContext() method to
instantiate an appropriate
DragSourceContext
and associate the DragSourceContextPeer
with that.
If the Drag and Drop System is
unable to initiate a drag operation for
some reason, the startDrag() method throws
a java.awt.dnd.InvalidDnDOperationException
to signal such a condition. Typically this
exception is thrown when the underlying platform
system is either not in a state to
initiate a drag, or the parameters specified are invalid.
Note that during the drag, the
set of operations exposed by the source
at the start of the drag operation may not change
until the operation is complete.
The operation(s) are constant for the
duration of the operation with respect to the
DragSource . |
Fields Summary |
---|
private static final long | serialVersionUID | public static final Cursor | DefaultCopyDropThe default Cursor to use with a copy operation indicating
that a drop is currently allowed. null if
GraphicsEnvironment.isHeadless() returns true . | public static final Cursor | DefaultMoveDropThe default Cursor to use with a move operation indicating
that a drop is currently allowed. null if
GraphicsEnvironment.isHeadless() returns true . | public static final Cursor | DefaultLinkDropThe default Cursor to use with a link operation indicating
that a drop is currently allowed. null if
GraphicsEnvironment.isHeadless() returns true . | public static final Cursor | DefaultCopyNoDropThe default Cursor to use with a copy operation indicating
that a drop is currently not allowed. null if
GraphicsEnvironment.isHeadless() returns true . | public static final Cursor | DefaultMoveNoDropThe default Cursor to use with a move operation indicating
that a drop is currently not allowed. null if
GraphicsEnvironment.isHeadless() returns true . | public static final Cursor | DefaultLinkNoDropThe default Cursor to use with a link operation indicating
that a drop is currently not allowed. null if
GraphicsEnvironment.isHeadless() returns true . | private static final DragSource | dflt | static final String | dragSourceListenerKInternal constants for serialization. | static final String | dragSourceMotionListenerK | private transient FlavorMap | flavorMap | private transient DragSourceListener | listener | private transient DragSourceMotionListener | motionListener |
Constructors Summary |
---|
public DragSource()Creates a new DragSource .
if (GraphicsEnvironment.isHeadless()) {
throw new HeadlessException();
}
|
Methods Summary |
---|
public void | addDragSourceListener(java.awt.dnd.DragSourceListener dsl)Adds the specified DragSourceListener to this
DragSource to receive drag source events during drag
operations intiated with this DragSource .
If a null listener is specified, no action is taken and no
exception is thrown.
if (dsl != null) {
synchronized (this) {
listener = DnDEventMulticaster.add(listener, dsl);
}
}
| public void | addDragSourceMotionListener(java.awt.dnd.DragSourceMotionListener dsml)Adds the specified DragSourceMotionListener to this
DragSource to receive drag motion events during drag
operations intiated with this DragSource .
If a null listener is specified, no action is taken and no
exception is thrown.
if (dsml != null) {
synchronized (this) {
motionListener = DnDEventMulticaster.add(motionListener, dsml);
}
}
| public java.awt.dnd.DragGestureRecognizer | createDefaultDragGestureRecognizer(java.awt.Component c, int actions, java.awt.dnd.DragGestureListener dgl)Creates a new DragGestureRecognizer
that implements the default
abstract subclass of DragGestureRecognizer
for this DragSource ,
and sets the specified Component
and DragGestureListener on the
newly created object.
For this DragSource
the default is MouseDragGestureRecognizer .
return Toolkit.getDefaultToolkit().createDragGestureRecognizer(MouseDragGestureRecognizer.class, this, c, actions, dgl);
| public T | createDragGestureRecognizer(java.lang.Class recognizerAbstractClass, java.awt.Component c, int actions, java.awt.dnd.DragGestureListener dgl)Creates a new DragGestureRecognizer
that implements the specified
abstract subclass of
DragGestureRecognizer , and
sets the specified Component
and DragGestureListener on
the newly created object.
return Toolkit.getDefaultToolkit().createDragGestureRecognizer(recognizerAbstractClass, this, c, actions, dgl);
| protected java.awt.dnd.DragSourceContext | createDragSourceContext(java.awt.dnd.peer.DragSourceContextPeer dscp, java.awt.dnd.DragGestureEvent dgl, java.awt.Cursor dragCursor, java.awt.Image dragImage, java.awt.Point imageOffset, java.awt.datatransfer.Transferable t, java.awt.dnd.DragSourceListener dsl)Creates the DragSourceContext to handle this drag.
To incorporate a new DragSourceContext
subclass, subclass DragSource and
override this method.
If dragImage is null , no image is used
to represent the drag over feedback for this drag operation, but
NullPointerException is not thrown.
If dsl is null , no drag source listener
is registered with the created DragSourceContext ,
but NullPointerException is not thrown.
If dragCursor is null , the default drag
cursors are used for this drag operation.
NullPointerException is not thrown.
return new DragSourceContext(dscp, dgl, dragCursor, dragImage, imageOffset, t, dsl);
| public static java.awt.dnd.DragSource | getDefaultDragSource()Gets the DragSource object associated with
the underlying platform.
if (GraphicsEnvironment.isHeadless()) {
throw new HeadlessException();
} else {
return dflt;
}
| public java.awt.dnd.DragSourceListener[] | getDragSourceListeners()Gets all the DragSourceListener s
registered with this DragSource .
return (DragSourceListener[])getListeners(DragSourceListener.class);
| public java.awt.dnd.DragSourceMotionListener[] | getDragSourceMotionListeners()Gets all of the DragSourceMotionListener s
registered with this DragSource .
return (DragSourceMotionListener[])
getListeners(DragSourceMotionListener.class);
| public static int | getDragThreshold()Returns the drag gesture motion threshold. The drag gesture motion threshold
defines the recommended behavior for {@link MouseDragGestureRecognizer}s.
If the system property awt.dnd.drag.threshold is set to
a positive integer, this method returns the value of the system property;
otherwise if a pertinent desktop property is available and supported by
the implementation of the Java platform, this method returns the value of
that property; otherwise this method returns some default value.
The pertinent desktop property can be queried using
java.awt.Toolkit.getDesktopProperty("DnD.gestureMotionThreshold") .
int ts = ((Integer)AccessController.doPrivileged(
new GetIntegerAction("awt.dnd.drag.threshold", 0))).intValue();
if (ts > 0) {
return ts;
} else {
Integer td = (Integer)Toolkit.getDefaultToolkit().
getDesktopProperty("DnD.gestureMotionThreshold");
if (td != null) {
return td.intValue();
}
}
return 5;
| public java.awt.datatransfer.FlavorMap | getFlavorMap()This method returns the
FlavorMap for this DragSource .
return flavorMap;
| public T[] | getListeners(java.lang.Class listenerType)Gets all the objects currently registered as
FooListener s upon this DragSource .
FooListener s are registered using the
addFooListener method.
EventListener l = null;
if (listenerType == DragSourceListener.class) {
l = listener;
} else if (listenerType == DragSourceMotionListener.class) {
l = motionListener;
}
return DnDEventMulticaster.getListeners(l, listenerType);
| public static boolean | isDragImageSupported()Reports
whether or not drag
Image support
is available on the underlying platform.
Toolkit t = Toolkit.getDefaultToolkit();
Boolean supported;
try {
supported = (Boolean)Toolkit.getDefaultToolkit().getDesktopProperty("DnD.isDragImageSupported");
return supported.booleanValue();
} catch (Exception e) {
return false;
}
| private static java.awt.Cursor | load(java.lang.String name)
/*
* load a system default cursor
*/
if (GraphicsEnvironment.isHeadless()) {
return null;
}
try {
return (Cursor)Toolkit.getDefaultToolkit().getDesktopProperty(name);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("failed to load system cursor: " + name + " : " + e.getMessage());
}
| void | processDragDropEnd(java.awt.dnd.DragSourceDropEvent dsde)This method calls dragDropEnd on the
DragSourceListener s registered with this
DragSource , and passes them the specified
DragSourceDropEvent .
DragSourceListener dsl = listener;
if (dsl != null) {
dsl.dragDropEnd(dsde);
}
| void | processDragEnter(java.awt.dnd.DragSourceDragEvent dsde)This method calls dragEnter on the
DragSourceListener s registered with this
DragSource , and passes them the specified
DragSourceDragEvent .
DragSourceListener dsl = listener;
if (dsl != null) {
dsl.dragEnter(dsde);
}
| void | processDragExit(java.awt.dnd.DragSourceEvent dse)This method calls dragExit on the
DragSourceListener s registered with this
DragSource , and passes them the specified
DragSourceEvent .
DragSourceListener dsl = listener;
if (dsl != null) {
dsl.dragExit(dse);
}
| void | processDragMouseMoved(java.awt.dnd.DragSourceDragEvent dsde)This method calls dragMouseMoved on the
DragSourceMotionListener s registered with this
DragSource , and passes them the specified
DragSourceDragEvent .
DragSourceMotionListener dsml = motionListener;
if (dsml != null) {
dsml.dragMouseMoved(dsde);
}
| void | processDragOver(java.awt.dnd.DragSourceDragEvent dsde)This method calls dragOver on the
DragSourceListener s registered with this
DragSource , and passes them the specified
DragSourceDragEvent .
DragSourceListener dsl = listener;
if (dsl != null) {
dsl.dragOver(dsde);
}
| void | processDropActionChanged(java.awt.dnd.DragSourceDragEvent dsde)This method calls dropActionChanged on the
DragSourceListener s registered with this
DragSource , and passes them the specified
DragSourceDragEvent .
DragSourceListener dsl = listener;
if (dsl != null) {
dsl.dropActionChanged(dsde);
}
| private void | readObject(java.io.ObjectInputStream s)Deserializes this DragSource . This method first performs
default deserialization. Next, this object's FlavorMap is
deserialized by using the next object in the stream.
If the resulting FlavorMap is null , this
object's FlavorMap is set to the default FlavorMap for
this thread's ClassLoader .
Next, this object's listeners are deserialized by reading a
null -terminated sequence of 0 or more key/value pairs
from the stream:
- If a key object is a
String equal to
dragSourceListenerK , a DragSourceListener is
deserialized using the corresponding value object and added to this
DragSource .
- If a key object is a
String equal to
dragSourceMotionListenerK , a
DragSourceMotionListener is deserialized using the
corresponding value object and added to this DragSource .
- Otherwise, the key/value pair is skipped.
s.defaultReadObject();
// 'flavorMap' was written explicitly
flavorMap = (FlavorMap)s.readObject();
// Implementation assumes 'flavorMap' is never null.
if (flavorMap == null) {
flavorMap = SystemFlavorMap.getDefaultFlavorMap();
}
Object keyOrNull;
while (null != (keyOrNull = s.readObject())) {
String key = ((String)keyOrNull).intern();
if (dragSourceListenerK == key) {
addDragSourceListener((DragSourceListener)(s.readObject()));
} else if (dragSourceMotionListenerK == key) {
addDragSourceMotionListener(
(DragSourceMotionListener)(s.readObject()));
} else {
// skip value for unrecognized key
s.readObject();
}
}
| public void | removeDragSourceListener(java.awt.dnd.DragSourceListener dsl)Removes the specified DragSourceListener from this
DragSource .
If a null listener is specified, no action is taken and no
exception is thrown.
If the listener specified by the argument was not previously added to
this DragSource , no action is taken and no exception
is thrown.
if (dsl != null) {
synchronized (this) {
listener = DnDEventMulticaster.remove(listener, dsl);
}
}
| public void | removeDragSourceMotionListener(java.awt.dnd.DragSourceMotionListener dsml)Removes the specified DragSourceMotionListener from this
DragSource .
If a null listener is specified, no action is taken and no
exception is thrown.
If the listener specified by the argument was not previously added to
this DragSource , no action is taken and no exception
is thrown.
if (dsml != null) {
synchronized (this) {
motionListener = DnDEventMulticaster.remove(motionListener, dsml);
}
}
| public void | startDrag(java.awt.dnd.DragGestureEvent trigger, java.awt.Cursor dragCursor, java.awt.Image dragImage, java.awt.Point imageOffset, java.awt.datatransfer.Transferable transferable, java.awt.dnd.DragSourceListener dsl, java.awt.datatransfer.FlavorMap flavorMap)Start a drag, given the DragGestureEvent
that initiated the drag, the initial
Cursor to use,
the Image to drag,
the offset of the Image origin
from the hotspot of the Cursor at
the instant of the trigger,
the Transferable subject data
of the drag, the DragSourceListener ,
and the FlavorMap .
SunDragSourceContextPeer.setDragDropInProgress(true);
try {
if (flavorMap != null) this.flavorMap = flavorMap;
DragSourceContextPeer dscp = Toolkit.getDefaultToolkit().createDragSourceContextPeer(trigger);
DragSourceContext dsc = createDragSourceContext(dscp,
trigger,
dragCursor,
dragImage,
imageOffset,
transferable,
dsl
);
if (dsc == null) {
throw new InvalidDnDOperationException();
}
dscp.startDrag(dsc, dsc.getCursor(), dragImage, imageOffset); // may throw
} catch (RuntimeException e) {
SunDragSourceContextPeer.setDragDropInProgress(false);
throw e;
}
| public void | startDrag(java.awt.dnd.DragGestureEvent trigger, java.awt.Cursor dragCursor, java.awt.datatransfer.Transferable transferable, java.awt.dnd.DragSourceListener dsl, java.awt.datatransfer.FlavorMap flavorMap)Start a drag, given the DragGestureEvent
that initiated the drag, the initial
Cursor to use,
the Transferable subject data
of the drag, the DragSourceListener ,
and the FlavorMap .
startDrag(trigger, dragCursor, null, null, transferable, dsl, flavorMap);
| public void | startDrag(java.awt.dnd.DragGestureEvent trigger, java.awt.Cursor dragCursor, java.awt.Image dragImage, java.awt.Point dragOffset, java.awt.datatransfer.Transferable transferable, java.awt.dnd.DragSourceListener dsl)Start a drag, given the DragGestureEvent
that initiated the drag, the initial Cursor
to use,
the Image to drag,
the offset of the Image origin
from the hotspot of the Cursor
at the instant of the trigger,
the subject data of the drag, and
the DragSourceListener .
startDrag(trigger, dragCursor, dragImage, dragOffset, transferable, dsl, null);
| public void | startDrag(java.awt.dnd.DragGestureEvent trigger, java.awt.Cursor dragCursor, java.awt.datatransfer.Transferable transferable, java.awt.dnd.DragSourceListener dsl)Start a drag, given the DragGestureEvent
that initiated the drag, the initial
Cursor to
use,
the Transferable subject data
of the drag, and the DragSourceListener .
startDrag(trigger, dragCursor, null, null, transferable, dsl, null);
| private void | writeObject(java.io.ObjectOutputStream s)Serializes this DragSource . This method first performs
default serialization. Next, it writes out this object's
FlavorMap if and only if it can be serialized. If not,
null is written instead. Next, it writes out
Serializable listeners registered with this
object. Listeners are written in a null -terminated sequence
of 0 or more pairs. The pair consists of a String and an
Object ; the String indicates the type of the
Object and is one of the following:
dragSourceListenerK indicating a
DragSourceListener object;
dragSourceMotionListenerK indicating a
DragSourceMotionListener object.
s.defaultWriteObject();
s.writeObject(SerializationTester.test(flavorMap) ? flavorMap : null);
DnDEventMulticaster.save(s, dragSourceListenerK, listener);
DnDEventMulticaster.save(s, dragSourceMotionListenerK, motionListener);
s.writeObject(null);
|
|