|
Spec-Zone .ru
спецификации, руководства, описания, API
|
У этого документа есть эти разделы:
Эта спецификация определяет API для средств перетаскивания и отбрасывания для Java 2 Платформы.
Основные требования, чтобы эта спецификация адресовалась:
java.awt.datatransfer.* пакет, чтобы включить передаче данных, описанных расширяемой системой типа данных, основанной на стандарте MIME.Спецификация происходит из предыдущей упомянутой выше работы, но включает существенные различия от той исходной работы в результате появления модели событий JavaBeans, легкий вес (Swing) компоненты, и понимание увеличения межплатформенных проблем интеграции и функциональной совместимости.
Следующие разделы покрывают перетаскивание и отбрасывают API.
Перетащите и отбрасывание является жестом непосредственного управления, найденным во многих системах графического интерфейса пользователя, который обеспечивает механизм, чтобы передать информацию между двумя объектами, логически связанными с элементами представления в GUI. Обычно управляемый физическим жестом человеческого пользователя, использующего соответствующее устройство ввода данных, перетащите, и отбрасывание предоставляет обоим механизм, чтобы позволить непрерывной обратной связи относительно возможного исхода любой последующей передачи данных пользователю во время навигации по элементам представления в GUI, и средствах предусмотреть любое последующее согласование данных и передачу.
Типичное перетаскивает и отбрасывает работу, может анализироваться в следующие состояния (не полностью последовательно):
DragSource появляется, связанный с некоторым элементом представления (Component) в GUI, чтобы инициировать перетаскивание и отбрасывание некоторых потенциально Transferable данные.DropTargets прибывают в/выходить существование, связанное с элементами представления в GUI (Components), потенциально способный к потреблению Transferable типы данных.DragGestureRecognizer получается из DragSource и связывается с a Component чтобы отследить и идентифицировать, любой перетаскивает жест инициирования пользователем по Component.Component, который зарегистрированный DragGestureRecognizer обнаруживает, и уведомляет DragGestureListener из. Отметьте: Хотя тело этого документа последовательно обращается к стимулу для работы перетаскивания и отбрасывания, являющейся физическим жестом человеческим пользователем, это не устраняет программно управляемую работу DnD, данную соответствующую реализацию a DragSource.
DragGestureListener причины DragSource инициировать работу перетаскивания и отбрасывания от имени пользователя, возможно анимируя GUI Cursor и/или рендеринг Image из элемента (ов), которые являются предметом работы.Component(s) в GUI со связанным DropTarget(s), DragSource получает уведомления, чтобы обеспечить, "Перетаскивают По" эффектам обратной связи, и DropTarget(s) получите уведомления, чтобы обеспечить, "Перетаскивают Под" эффектами обратной связи, основанными на поддерживаемой работе (ах) и включенный тип (ы) данных. Сам жест перемещает логический курсор через иерархию GUI, пересекая геометрию GUI Component(s), возможно приведение к логическому "Перетаскивает" ввод курсора, пересечение, и впоследствии отъезд Component(s) и связанный DropTarget(s).
DragSource возразите, что декларации "Перетаскивают По" обратной связи пользователю в типичном случае, анимируя GUI Cursor связанный с логическим курсором.
DropTarget декларация объектов "Перетаскивает Под" обратной связью пользователю, в типичном случае, представляя анимации в их связанном GUI Component(s) под GUI Cursor.
DragSource и DropTarget: Копия, Перемещение или Ссылка (ссылка).DragSource и набор типов данных, постижимых DropTarget.DragSource и DropTarget получите уведомления, которые включают, и результат в согласовании типа и передаче, информация, связанная с DragSource через a Transferable объект.Остаток от этого документа детализирует предложенные изменения API, чтобы поддерживать эту модель.
Жест (ы), который может инициировать перетаскивание и отбросить работу, изменяется, не только на платформу, но также и на Component, и для каждого устройства. Поэтому механизм требуется, чтобы инкапсулировать эти зависимости, таким образом делая задачу автора a Component это хочет инициировать намного более простую работу перетаскивания и отбрасывания.
DragGestureRecognizer абстрактный class для всего device/platform/Component определенный перетаскивают и отбрасывают устройства распознавания жеста, и определяется как:
public abstract DragGestureRecognizer {
protected DragGestureRecognizer(
DragSource ds,
Component c,
int srcActions,
DragGestureListener dgl
);
public Component getComponent();
public void setComponent(Component c);
public int getSourceActions();
public void setSourceActions(int actions);
public java.awt.InputEvent getTriggerEvent();
public void resetRecognizer();
public void addDragGestureListener(
DragGestureListener dgl
) throws TooManyListenerExceptions;
public void removeDragGestureListener(
DragGestureListener dgl
);
protected abstract void registerListeners();
protected abstract void unregisterListeners();
protected void fireDragGestureRecognized(
int dragAction
);
protected void appendEvent(InputEvent awtie);
}
Соответствующие конкретные подклассы DragGestureRecognizer поскольку деталь может быть получена во множестве путей; от a DragSource экземпляр, от Toolkit, или другими средствами. Конкретные подклассы реализации получаются через стандартные API, определяя a Class ссылка на краткий обзор DragGestureRecognizer суперкласс, экземпляр конкретного подкласса этого фактического параметра инстанцируют и возвращается просителю.
Однажды a DragGestureRecognizer экземпляр связывается с a Component и a DragSource это регистрирует свой собственный определенный набор EventListeners' с целью Component чтобы следить за развитием соответствующих событий, поставляемых этому Component обнаружить жест инициирования. (Используя registerListeners и unregisterListeners добавить/удалить их контроль EventListeners').
Отметьте это a DragGestureRecognizer может бросить любого IllegalStateException или IllegalArgumentException если любой Component или DragSource определенный или не в корректном состоянии для, или не является взаимодействующим с, это DragGestureRecognizer.
Когда бетон DragGestureRecognizer экземпляр обнаруживает перетащенный инициируемый пользовательский жест на Component это связывается с, это запустит a DragGestureEvent к DragGestureListener зарегистрированный на его одноадресном источнике события для DragGestureListener события. Это DragGestureListener ответственно за порождение связанного DragSource запустить работу перетаскивания и отбрасывания (если соответствующий).
Реализация обеспечивает (по крайней мере), абстрактный подкласс для того, чтобы он распознал жесты устройства мыши MouseDragGestureRecognizer. Другие абстрактные подклассы могут быть обеспечены платформой, чтобы поддерживать другие устройства ввода данных или определенный Компонент семантика class. Конкретные суперклассы этого MouseDragGestureRecognizer это инкапсулирует платформу зависимая мышь, базируемые жесты доступны от Toolkit объект через createDragGestureRecognizer(Class adgrc, DragSource ds, Component c, int sa, DragGestureListener dgl) метод. Это Toolkit API обеспечивает платформу зависимые конкретные реализации, которые расширяют определенные независимые от платформы абстрактные определения (классы).
MouseDragGestureRecognizer абстрактный class определяется как:
public abstract MouseDragGestureRecognizer
extends DragGestureRecognizer
implements MouseListener, MouseMotionListener {
public MouseDragGestureRecognizer(
DragSource ds,
Component c,
int sa,
DragGestureListener dsl
);
//...
}
DragGestureListener определяется как:
public interface DragGestureListener extends EventListener {
void dragGestureRecognized(DragGestureEvent dge);
}
Обычно dragGestureRecognized() метод будет просто, через DragGestureEvent's API удобства startDrag, запустите перетаскивание и отбросьте работу на связанном DragSource.
Отметьте это на Component (class или экземпляр), поведение, которое может произвести жест инициирования, обычно реализовывалось бы в этом DragGestureListener метод, или в DragGestureRecognizer разделите на подклассы где необходимо или возможный.
DragGestureEvent определяется как:
publc class DragGestureEvent extends EventObject {
public DragGestureEvent(DragGestureRecognizer dgr,
int dragAction,
java.util.List events
);
public DragGestureRecognizer getSourceAsDragGestureRecognizer();
public Component getComponent();
public DragSource getDragSource();
public java.util.Iterator iterator();
public Object[] toArray();
public Object[] toArray(Object[] array);
public int getDragAction();
public startDrag(Cursor dragCursor,
Transferable t,
DragSourceListener dsl
);
public startDrag(Cursor dragCursor,
Image dragImage,
Point imageOffset,
Transferable t,
DragSourceListener dsl
);
//...
}
DragGestureEvent инкапсулирует всю информацию относительно природы жеста, который был только что распознан, включая:
DragGestureRecognizer это распознало жестComponent то, что жест произошел наDragSource это обработает работуInputEvent объекты, которые включают жест. DragSource объект, ответственный за инициирование работы перетаскивания и отбрасывания:
DragSource и связанные постоянные интерфейсы определяются следующим образом:
DnDConstants class определяет операции, которые могут быть применены к предмету передачи:
public final class java.awt.dnd.DnDConstants {
public static int ACTION_NONE = 0x0;
public static int ACTION_COPY = 0x1;
public static int ACTION_MOVE = 0x2;
public static int ACTION_COPY_OR_MOVE= ACTION_COPY | ACTION_MOVE;
public static int ACTION_REFERENCE = 0x40000000;
}
public class java.awt.dnd.DragSource {
public static Cursor DefaultCopyDrop;
public static Cursor DefaultMoveDrop;
public static Cursor DefaultLinkDrop;
public static Cursor DefaultCopyNoDrop;
public static Cursor DefaultMoveNoDrop;
public static Cursor DefaultLinkNoDrop;
public static DragSource getDefaultDragSource();
public static boolean isDragImageSupported();
public void startDrag(DragGestureEvent trigger,
Cursor dragCursor,
Image dragImage,
Point dragImageOffset,
Transferable transferable,
DragSourceListener dsl,
FlavorMap fm)
throws InvalidDnDOperationException;
protected DragSourceContext createDragSourceContext(
DragSourceContextPeer dscp,
DragGestureEvent trigger,
Cursor dragCursor,
Image dragImage,
Point dragImageOffset,
Transferable transferable,
DragSourceListener dsl
);
public FlavorMap getFlavorMap();
public DragGestureRecongizer createDragGestureRecognizer(
Class abstractRecognizerClass,
Component c,
int srcActions,
DragGestureListener dgl
);
public DragGestureRecongizer createDefaultDragGestureRecognizer(
Component c,
int srcActions,
DragGestureListener dgl
);
//...
}
DragSource может использоваться во многих сценариях:
TextField). [зависящий от реализации]Component, или специализированный объект связался с a Component экземпляр в GUI. [зависящий от реализации]Объект управления, получу a DragSource экземпляр до жеста пользователя, производя связанное Component, чтобы обработать работу. После того, как полученный a DragGestureRecognizer должен быть получен и использоваться, чтобы связаться DragSource с a Component.
Начальная интерпретация жеста пользователя, и последующий запуск перетащить работы являются ответственностью реализации Component, это обычно реализуется a DragGestureRecognizer.
Когда жест происходит, DragSource's startDrag метод должен быть вызван, чтобы вызвать обработку навигационных жестов пользователя, и поставка перетаскивают и отбрасывают уведомления о протоколе. A DragSource только разрешу, чтобы сингл перетащил и отбросил работу, чтобы быть текущим в любой момент, и должен отклонить дальше startDrag запросы, бросая IllegalDnDOperationException до тех пор, пока существующая работа полна.
Чтобы запустить перетащить работу вызывающая сторона startDrag метод должен обеспечить следующие параметры:
DragGestureEvent для жеста.Cursor представление начальной буквы "Перетаскивает По" обратной связи для определенной работы (). (Это должно быть a Cursor это не предоставляет "Отбрасывания" визуальная обратная связь пользователю).Image визуально представлять элемент, или элемент (ы), которые являются предметом (ами) работы.На платформах, которые могут поддерживать эту функцию, "Перетащить" изображение может быть связано с работой, чтобы улучшить точность, "Перетаскивают По" обратной связи. Это изображение обычно было бы маленьким "графическим" представлением объекта, или объектов, перетаскиваемых, и будет представлено базовой системой, отслеживая перемещение, и совпадающее с, но обычно в дополнение к Cursor анимация.
Где это средство не доступно, или где изображение не имеет подходящего типа, который будет представлен базовой системой, этот параметр игнорируется и только Cursor "Перетащите По" результатам анимации, таким образом, приложения не должны зависеть от этой функции. Присутствие средства на определенной платформе может быть протестировано, вызывая статический метод isDragImageSupported.
Image обеспечивается; a Point (в координатном пространстве Component) определение начального источника этого Image относительно координат "горячей точки" перетащить "Курсора", в координатном пространстве Component, во время начального жеста, в целях инициировать правильно расположенный "Перетаскивают По" анимации этого Image относительно той "горячей точки".Transferable это описывает различное DataFlavor(s) это представляет предмет (ы) любой последующей передачи данных, которая может следовать из успешного Отбрасывания. Transferable экземпляр, связанный с DragSource в начале перетащить работы, представляет объект (ы) или данные, которые являются операндом (ами), или предметом (ами), работы Перетаскивания и Отбрасывания, которая является информацией, которую впоследствии передадут от DragSource к DropTarget в результате успешного Отбрасывания на Component связанный с этим DropTarget.
Отметьте, что многократный (наборы) или гомогенных, или неоднородных, объектов может быть предмет работы Перетаскивания и Отбрасывания, создавая контейнерный объект, который является предметом передачи, и реализациями Transferable. Однако нужно отметить, что, так как ни одна из предназначенных собственных систем платформ не поддерживает стандартный механизм для того, чтобы описать и таким образом передать такие наборы, не возможно реализовать такие передачи в прозрачном, или платформа переносимый вид.
DragSourceListener экземпляр, который впоследствии получит события, уведомляющие это относительно изменений в состоянии продолжающейся операции, чтобы обеспечить, "Перетаскивает По" обратной связи пользователю.Как указано выше, основная роль startDrag метод должен инициировать Перетаскивание от имени пользователя. Чтобы выполнить это, startDrag метод должен создать a DragSourceContext экземпляр, чтобы отследить работу непосредственно, и что еще более важно это должно инициировать работу непосредственно в базовой реализации платформы. Чтобы выполнить это, DragSource должен сначала получить a DragSourceContextPeer от базовой системы (обычно через вызов java.awt.Toolkit.createDragSourceContextPeer метод), и впоследствии связываются, это недавно создало DragSourceContextPeer (который обеспечивает независимый от платформы интерфейс для базовых системных возможностей) с a DragSourceContext.The startDrag метод вызывает createDragSourceContext метод, чтобы инстанцировать соответствующего DragSourceContext и партнер DragSourceContextPeer с этим.
Если система перетаскивания и отбрасывания неспособна инициировать перетащить работу по некоторым причинам startDrag метод должен бросить a java.awt.dnd.InvalidDnDOperationException сигнализировать такое условие. Обычно это исключение выдается, когда базовая система платформы или не в состоянии, чтобы инициировать перетаскивание, или определенные параметры недопустимы.
Отметьте, что во время перетаскивания ни одного набор операций источник, представленный в начале перетащить работы, не может измениться для продолжительности работы, другими словами работы () и является постоянным для продолжительности работы относительно DragSource.
getFlavorMap метод используется базовой системой, чтобы получить a FlavorMap возразите, чтобы отобразиться DataFlavors представленный Transferable к именам типов данных базовой платформы DnD. [см. позже для деталей FlavorMap]
"Частное" FlavorMap может быть обеспечен для startDrag() метод DragSource, или нуль, когда "значение по умолчанию" FlavorMap для этого DragSource class или экземпляр используются.
В результате a DragSource's startDrag метод, успешно вызываемый экземпляр DragSourceContext class создается. Этот экземпляр ответственен за отслеживание состояния работы от имени DragSource и диспетчеризация изменений состояния к DragSourceListener.
DragSourceContext class определяется следующим образом:
public class DragSourceContext implements DragSourceListener {
public DragSourceContext(
DragSourceContextPeer dscp,
DragGestureEvent trigger,
Cursor dragCursor,
Image dragImage,
Point dragOffset,
Transferable transferable,
DragSourceListener dsl
);
public DragSource getDragSource();
public Component getComponent();
public DragGestureEvent getTrigger();
public Image getDragImage();
public Point getDragImageOffset();
public void transferablesFlavorsChanged();
public int getSourceActions();
public Cursor getCursor();
pbulic void setCursor(Cursor Cursor)
throws InvalidDnDOperationException;
public void addDragSourceListener(DragSourceListener dsl)
throws TooManyListenersException;
public void removeDragSourceListener(DragSourceListener dsl);
protected updateCurrentCursor(int dropOperation,
int targetActions,
int status
);
// values for status parameter above.
protected static final int DEFAULT = 0;
protected static final int ENTER = 1;
protected static final int OVER = 2;
protected static final int CHANGED = 3;
//...
}
Отметьте что DragSourceContext непосредственно реализации DragSourceListener, это должно позволить коллегу платформы, DragSourceContextPeer экземпляр, создаваемый DragSource, уведомлять DragSourceContext из изменений в состоянии в продолжающейся операции, и таким образом позволяет DragSourceContext вставлять себя между платформой и DragSourceListener если инициатором работы.
Конечный автомат, который платформа представляет относительно источника, или инициатора работы Перетаскивания и Отбрасывания, детализируется ниже:

Уведомления об изменениях в состоянии относительно инициатора во время работы перетаскивания и отбрасывания, как иллюстрировано выше, поставляются от DragSourceContextPeer, к соответствующему DragSourceContext, который делегирует уведомления через одноадресную передачу совместимый JavaBeans EventListener подынтерфейс, к произвольному объекту, который реализует DragSourceListener зарегистрированный в DragSource через startDrag.
Основная ответственность DragSourceListener должен контролировать продвижение навигации пользователя во время работы перетаскивания и отбрасывания и обеспечить, "Перетаскивают - По" обратной связи эффектов пользователю. Обычно это выполняется через изменения к, "Перетаскивают Курсор".
Каждый перетащить работу имеет 2 логических состояния курсора (Перетащите Курсоры), связанный с этим:
Cursor, курсор, выведенный на экран, перетаскивая по допустимому DropTarget.Cursor, курсор, выведенный на экран, перетаскивая по всему остальному (начальное состояние курсора в начале перетаскивания).Состояние Cursor может быть изменен, вызывая setCursor метод DragSourceContext.
DragSourceListener интерфейс определяется следующим образом:
public interface java.awt.dnd.DragSourceListener
extends java.util.EventListener {
void dragEnter (DragSourceDragEvent dsde);
void dragOver (DragSourceDragEvent dsde);
void dropActionChanged (DragSourceDragEvent dsde);
void dragExit (DragSourceEvent dse);
void dragDropEnd (DragSourceDropEvent dsde);
}
Поскольку перетащить работа прогрессирует, DragSourceListener's dragEnter, dragOver, и dragExit методы должны быть вызваны в результате навигации пользователем логического, "Перетаскивают" расположение курсора, пересекающее геометрию GUI Component(s) со связанным DropTarget(s). [См. ниже для деталей DropTarget's взаимодействия протокола].
DragSourceListener's dragEnter метод вызывается, когда следующие условия являются истиной:
Component's видимая геометрия.Component имеет активное DropTarget связанный. DropTarget's зарегистрированный DropTargetListener dragEnter метод вызывается и возвращается успешно.
Зарегистрированный DropTargetListener вызывает DropTargetDragEvent's acceptDrag метод, чтобы принять перетаскивание основанного на опросе потенциала источника отбрасывает действия и доступные типы данных (DataFlavors).
DragSourceListener's dragOver метод вызывается, когда следующие условия являются истиной:
Component связанный с предыдущим dragEnter вызов.Component все еще имеет a DropTarget связанный.DropTarget является все еще активным.DropTarget's зарегистрированный DropTargetListener dragOver метод вызывается и возвращается успешно.DropTarget не отклоняет перетаскивание через rejectDrag. DragSourceListener's dragExit метод вызывается, когда одно из следующих условий является истиной:
Component связанный с предыдущим dragEnter вызов. Или:
Component то, что горячая точка логического курсора, пересеченная, это привело к предыдущему dragEnter вызов, больше не имеет активное DropTarget (или DropTargetListener) связанный. Или:
DropTarget's DropTargetListener вызвал rejectDrag начиная с последнего dragEnter или dragOver вызов. DragSourceListener's dropActionChanged() метод вызывается, когда состояние устройства () ввода данных, обычно кнопки мыши или модификаторы клавиатуры, что пользователь взаимодействует, чтобы выполнить перетащить работу, изменения.
dragDropEnd() метод вызывается, чтобы показать, что работа завершается. getDropSuccess метод DragSourceDropEvent может использоваться, чтобы определить состояние завершения. getDropAction метод возвращает работу что DropTarget выбранный (через DropTargetDropEvent acceptDrop параметр), чтобы примениться к работе отбрасывания.
Как только этот метод полон ток DragSourceContext и связанные ресурсы недопустимы.
DragSourceEvent class является корнем Event class для всех событий, имеющих отношение DragSource, и определяется следующим образом:
public class java.awt.dnd.DragSourceEvent extends java.util.EventObject {
public DragSourceEvent(DragSourceContext dsc);
public DragSourceContext getDragSourceContext();
//...
};
Экземпляр этого события передают к DragSourceListener dragExit метод.
DragSourceDragEvent class определяется следующим образом:
public class java.awt.dnd.DragSourceDragEvent extends DragSourceEvent {
public int getTargetActions();
public int getUserAction();
public int getGestureModifiers();
public int getGestureModifiersEx();
public int getDropAction();
}
Экземпляр вышеупомянутого class передают к a DragSourceListener's dragEnter, dragOver, и dragGestureChanged методы.
getDragSourceContext метод возвращается DragSourceContext связанный с током перетаскивают и отбрасывают работу.
getUserAction метод возвращает действие, которое в настоящий момент выбирается жестом пользователя.
getTargetActions метод возвращает действие отбрасывания, выбранное текущей целью отбрасывания, если это действие отбрасывания поддерживается перетащить источником или DnDConstants.ACTION_NONE если это действие отбрасывания не поддерживается перетащить источником.
Логическое пересечение этих двух результатов и набор действий отбрасывания, поддерживаемых перетащить источником, определяют фактический эффект отбрасывания и возвращаются через getDropAction.
getGestureModifiers метод возвращает текущее состояние модификаторов устройства ввода данных, обычно кнопки мыши и модификаторы клавиатуры, связанные жестом пользователя.
getGestureModifiersEx метод возвращает текущее состояние устройства ввода данных расширенные модификаторы, связанные жестом пользователя.
DragSourceDropEvent class определяется следующим образом:
public public class java.awt.dnd.DragSourceDropEvent
extends java.util.EventObject {
public DragSourceDropEvent(DragSourceContext dsc);
public DragSourceDropEvent(DragSourceContext dsc,
int action,
boolean success);
public boolean getDropSuccess();
public int getDropAction();
}
Экземпляр вышеупомянутого class передают к a DragSourceListener's dragDropEnd метод. Это событие инкапсулирует состояние завершения работы перетаскивания и отбрасывания для DragSource.
Если отбрасывание происходит, то участие DropTarget будет сигнализировать успех или провал передачи данных через DropTargetContext's dropComplete метод, это состояние делается доступным для инициатора через getDropSuccess метод. Работа, что место назначения DropTarget выбранный, чтобы выполнить на предмет перетаскивания (проходил мимо DropTarget's acceptDrop метод), возвращается через getDropAction метод.
Если перетащить работа была прервана по любой причине до появления отбрасывания, например если стороны пользователя жест снаружи a DropTarget, или если DropTarget вызывает rejectDrop, getDropSuccess метод возвратит false, иначе истина.
java.awt.Component У class есть два дополнительных метода, добавленные, чтобы разрешить (скидка) ассоциацию с a DropTarget. В особенности:
public class java.awt.Component /* ... */ {
//...
public synchronized void setDropTarget(DropTarget dt);
public synchronized DropTarget getDropTarget(DropTarget df);
//...
}
Связать a DropTarget с a Component можно вызвать также; DropTarget.setCompononent или Component.setDropTarget методы. Таким образом соответствующие реализации обоих методов обязаны принимать меры против взаимных рекурсивных вызовов.
Разъединять a DropTarget с a Component можно вызвать также; DropTarget.setCompononent(null) или Component.setDropTarget(null) методы.
Совместимые реализации обоих методов метода set в DropTarget и Component должен быть реализован друг с точки зрения друга, чтобы гарантировать надлежащее обслуживание состояния друг друга.
setDropTarget броски метода IllegalArgumentException если DropTarget фактический параметр не является подходящим для использования с этим class / экземпляр Component. Это может также бросить UnsupportedOperationException если, например, Component не поддерживает внешнюю установку a DropTarget.
A DropTarget инкапсулирует всю специфичную для платформы обработку протокола Перетаскивания и Отбрасывания относительно роли получателя или места назначения работы.
Сингл DropTarget экземпляр может обычно связываться с любым произвольным экземпляром java.awt.Component. Установление такого отношения экспортирует связанное Components геометрия к клиентскому рабочему столу, как являющемуся восприимчивым, чтобы перетащить и отбросить операции, когда координаты логического курсора пересекает ту видимую геометрию.
DropTarget class определяется следующим образом:
public class java.awt.dnd.DropTarget
implements DropTargetListener, Serializable {
public DropTarget(Component c,
int actions,
DropTargetListener dsl,
boolean isActive,
FlavorMap fm
);
public DropTarget();
public DropTarget(Component c);
public DropTarget(Component c, DropTargetListener dsl);
public Component getComponent();
public void setComponent(Component c);
public DropTargetContext getDropTargetContext();
public void addDropTargetListener(DropTargetListener dte)
throws TooManyListenersException;
public void removeDropTargetListener(DropTargetListener dte);
public void setActive(boolean active);
public boolean isActive();
public FlavorMap getFlavorMap();
public void setFlavorMap(FlavorMap fm);
public void setDefaultActions(int actions);
public int getDefaultActions();
protected DropTargetContext createDropTargetContext();
public void addNotify(ComponentPeer cp);
public void removeNotify(ComponentPeer cp);
// ...
}
setComponent броски метода IllegalArgumentException если Component фактический параметр не является подходящим для использования с этим class / экземпляр DropTarget, и может также бросить UnsupportedOperationException если Component определенный отвергает внешнюю установку a DropTarget.
addDropTargetListener и removeDropTargetListener методы позволяют одноадресную передачу DropTargetListener быть измененным.
setActive и isActive методы позволяют DropTarget быть сделанным активным или иначе и для его текущего состояния, которое будет определено.
getFlavorMap методы используются, чтобы получить FlavorMap связанный с этим DropTarget в целях отобразить любые имена зависимого типа платформы к их независимому от платформы соответствию DataFlavors.
setFlavorMap метод позволяет новое FlavorMap быть присвоенным DropTarget, параметр нуля вызывает "значение по умолчанию" FlavorMap быть установленным для DropTarget.
createDropTargetContext метод только вызывается, чтобы предоставить базовой платформе зависимая коллега инстанцирование нового DropTargetContext поскольку Перетащить работа первоначально встречается Component связанный с DropTarget. Если нет DropTargetContext в настоящий момент связывается с a DropTarget, разрешенный побочный эффект вызова getDropTargetContext должен инстанцировать нового DropTargetContext.
addNotify и removeNotify от методов только вызывают Component уведомлять DropTarget из Component's (скидка) ассоциация с ComponentPeer.
Отметьте что DropTarget непосредственно реализации DropTargetListener, это должно позволить коллегу платформы, DropTargetContextPeer экземпляр, создаваемый платформой, чтобы уведомить DropTarget из изменений в состоянии в продолжающейся операции, и таким образом позволяет DropTarget вставлять себя между платформой и DropTargetListener зарегистрированный в DropTarget.
Как логический курсор, связанный с продолжающимся, перетаскивают и отбрасывают работу, сначала пересекает видимую геометрию a Component со связанным DropTarget, DropTargetContext связанный с DropTarget интерфейс, через который, доступ к, и управление состоянием протокола получателя достигается от DropTargetListener.
A DropTargetContext создается a DropTarget, через это createDropTargetContext метод, как побочный эффект звонка a DropTarget's getDropTargetContext метод, если не <> DropTargetContext в настоящий момент существует для этого DropTarget.
DropTargetContext интерфейс определяется следующим образом:
public class DropTargetContext {
public DropTarget getDropTarget();
public Component getComponent();
public void dropComplete(boolean success)
throws InvalidDnDOperationException;
public void acceptDrag(int dropAction);
public void rejectDrag();
public void acceptDrop(int dropAction);
public void rejectDrop();
public void addNotify(DropTargetContextPeer dtcp);
public void removeNotify();
protected Transferable createTransferableProxy(Transferable t,
boolean isLocal
);
protected void setTargetActions(int actions);
protected int getTargetActions();
protected DataFlavor[] getCurrentDataFlavors();
protected List getCurrentDataFlavorsAsList();
protected boolean isDataFlavorSupported(DataFlavor df);
protected Transferable getTransferable();
// ...
}
Большая часть доступа и способов управления защищаются, так как открытый доступ к их состоянию обычно достигается, вызывая через деталь DropTargetEvent подкласс, который делегирует запрос к DropTargetContext.
getDropTarget() возврат метода DropTarget это создало это DropTargetContext.
getComponent метод возвращается Component связанный с DropTarget это создало это DropTargetContext.
acceptDrag метод делегируется от подобного метода на DropTargetDragEvent и вызывается от одного из DropTargetListener's методы; dragEnter(), dragOver или dropActionChanged показать, что получатель готовится принять отбрасывание с определенной работой, который обычно является в настоящий момент выбранным действием пользователя.
rejectDrag метод делегируется от подобного метода на DropTargetDragEvent и вызывается от одного из DropTargetListener's методы; dragEnter, dragOver или dropActionChanged показать, что получатель неспособен принять отбрасывание с в настоящий момент выбранным действием пользователя.
acceptDrop метод делегируется от подобного метода на DropTargetDropEvent и вызывается от DropTargetListener's drop метод, чтобы показать, что получатель готовится принять отбрасывание с определенной работой, который обычно является в настоящий момент выбранным действием пользователя.
rejectDrop метод делегируется от подобного метода на DropTargetDropEvent и вызывается от DropTargetListener's drop метод, чтобы показать, что получатель неспособен принять отбрасывание с в настоящий момент выбранным действием пользователя. Это завершает работу перетаскивания и отбрасывания без передачи данных.
dropComplete метод сигнализирует к возникновению DragSource то, что DropTargetListener завершил передачу (и), которые включают предмет перетаскивания и отбрасывают работу и что работа полна. Успех (или отказ) передачи () и последующего приложения определенной работы сообщается значением фактического параметра.
getDataFlavors метод возвращает массив DataFlavors доступный от DragSource.
getTransferable метод возвращает a Transferable (не обязательно тот DragSource зарегистрированный, это может быть прокси, и конечно должно быть в случае меж-JVM) позволять передачам данных произойти через getTransferData метод. Отметьте, что это недопустимо, чтобы вызвать getTransferable без первого вызова acceptDrop.
addNotify и removeNotify методы исключительно вызывает базовая платформа DropTargetContextPeer чтобы уведомить DropTargetContext то, что работа перетаскивания и отбрасывания происходит/прекращается на DropTargetContext и связанный DropTarget.
createTransferableProxy метод включает a DropTargetContext реализация, чтобы вставить a Transferable между DropTargetListener и Transferable если вызывающей стороной, которая обычно является базовой платформой DropTargetContextPeer.
Обеспечение соответствующего "Перетаскивает - под" семантикой обратной связи, и обработкой любого последующего Отбрасывания, включается через DropTargetListener asssociated с a DropTarget.
DropTargetListener решает, что соответствующие "Перетаскивают - под" обратной связью и ее ответом на DragSource относительно преемственности отбрасывания, осматривая источники, предложенные действия, доступные типы данных и данные непосредственно.
Деталь DropTargetListener экземпляр может быть связан с a DropTarget через addDropTargetListener и удаленный через removeDropTargetListener методы.
public interface java.awt.dnd.DropTargetListener
extends java.util.EventListener {
void dragEnter (DropTargetDragEvent dtde);
void dragOver (DropTargetDragEvent dtde);
void dropActionChanged (DropTargetDragEvent dtde);
void dragExit (DropTargetDragEvent dtde);
void drop (DropTargetDropEvent dtde);
}

dragEnter метод DropTargetListener вызывается, когда горячая точка логического "Перетаскивает" Курсор, пересекает видимую часть DropTarget's связанный Component's геометрия. DropTargetListener, по получении этого уведомления, опрошу операции или действия, и типы данных (DataFlavors) и данные непосредственно как предоставлено DragSource чтобы определить надлежащие меры и "Перетаскивают - под" обратной связью, чтобы ответить вызовом также acceptDrag или rejectDrag.
dragOver метод DropTargetListener вызывается, в то время как горячая точка логического "Перетаскивает" Курсор в движении, продолжает пересекать видимую часть DropTarget's связанный Component's геометрия. DropTargetListener, по получении этого уведомления, опрошу работу "действия" типы данных и данных непосредственно как предоставлено DragSource чтобы определить соответствующие "действия" и "Перетаскивают - под" обратной связью, чтобы ответить вызовом также acceptDrag или rejectDrag.
dragExit метод DropTargetListener вызывается, когда горячая точка логического "Перетаскивает" Курсор, прекращает пересекать видимую часть DropTarget's связанный Component's геометрия, или сразу до a drop уведомление. DropTargetListener, по получении этого уведомления, отменю, любой "Перетаскивает - под" эффектами обратной связи, которые оно ранее применило. Отметьте что DropTargetContext связанный с DropTarget лишается законной силы как побочный эффект.
drop метод DropTargetListener вызывается в результате пользователя, завершающего их перетащить жест, пересекаясь. DropTargetListener, по получении этого уведомления, выполню работу, определенную возвращаемым значением getSourceActions метод на DropTargetDropEvent объект, на Transferable объект, возвращенный из getTransferable метод, и впоследствии вызывает dropComplete метод связанного DropTargetContext сигнализировать успех, или иначе, работы.
DropTargetEvent и DropTargetDragEvent определяются следующим образом:
public abstract class java.awt.dnd.DropTargetEvent
extends java.util.EventObject {
public DropTargetContext getDropTargetContext();
//...
}
A DropTargetEvent передается к DropTargetListener's dragExit метод.
public class java.awt.dnd.DropTargetDragEvent
extends java.awt.dnd.DropTargetEvent {
public Transferable getTransferable();
public Point getLocation();
public int getSourceActions();
public getDropAction();
public DataFlavor[] getCurrentDataFlavors();
public List getCurrentDataFlavorsAsList();
public boolean isDataFlavorSupported();
public void acceptDrag(int operation);
public void rejectDrag();
//...
}
A DropTargetDragEvent передается к DropTargetListener's dragEnter, dragOver и dropActionChanged методы.
getLocation возврат метода текущие координаты, относительно связанного Component's источник, горячей точки логического "Перетаскивают" курсор.
getSourceActions метод возвращает текущие "действия", или операции (ACTION_MOVE, ACTION_COPY, или ACTION_REFERENCE) DragSource партнеры с током перетаскивают и отбрасывают жест.
Возвращаемое значение getDropAction метод является действием, которое выбирается жестом пользователя.
getCurrentDataFlavors, getCurrentDataFlavorsAsList и isDataFlavorSupported методы обеспечиваются для получателя, чтобы опросить список типов, доступных из источника.
getTransferable метод обеспечивается для получателя, чтобы опросить доступные данные из источника. Отметьте это getTransferable на DropTargetDragEvent экземпляр нужно только вызвать в пределах соответствующего DropTargetListener's метод, и все необходимые данные должны быть получены от возвращенного Transferable перед тем методом возвраты.
DropTargetDropEvent определяется следующим образом:
public class java.awt.dnd.DropTargetDropEvent
extends java.awt.dnd.DropTargetEvent {
public Point getLocation();
public int getSourceActions();
public int getDropAction();
public void acceptDrop(int dropAction);
public void rejectDrop();
public boolean isLocalTransfer();
public DataFlavor[] getCurrentDataFlavors();
public List getCurrentDataFlavorsAsList();
public boolean isDataFlavorSupported(DataFlavor df);
public Transferable getTransferable();
public void dropComplete(boolean success);
//...
}
A DropTargetDropEvent передается к DropTargetListener's drop метод, поскольку отбрасывание происходит. DropTargetDropEvent обеспечивает DropTargetListener с доступом к данным, связанным с работой, через Transferable возвращенный из getTransferable метод.
Возвращаемое значение getSourceActions метод определяется, чтобы быть действием (ями), определенным источником в это время, в котором произошло отбрасывание.
Возвращаемое значение getDropAction метод является действием, которое выбирается жестом пользователя.
Возвращаемое значение getLocation метод определяется, чтобы быть расположением, в котором произошло отбрасывание.
getCurrentDataFlavors, getCurrentDataFlavorsAsList, и isDataFlavorSupported, методы обеспечиваются для получателя, чтобы опросить список типов, доступных из источника для последующей передачи через getTransferData метод Transferable.
Типичная реализация drop метод осмотрит действия и DataFlavors', доступные, чтобы определить, может ли успешный обмен произойти или нет.
Когда обмен может произойти, a DropTargetListener.drop реализация должна вызвать acceptDrop с выбранной работой как фактический параметр, до любого вызова getTransferable. Вызов getTransferable до acceptDrop приведу к InvalidDnDOperationException.
rejectDrop буду вызван, чтобы отклонить работу отбрасывания. После того, как названный никаким дальнейшим взаимодействием может произойти между этими двумя участниками, поэтому это типично, чтобы возвратиться из drop метод сразу после вызова этого.
isLocalTransfer метод должен возвратить true, если источник перетаскивания и отбросит работу, находится в пределах той же самой физической JVM как получатель drop уведомление, и ложь иначе.
Это различие является существенным получателю, когда оно получает ссылки на объект назад от вызова Transferable.getTransferData в локальном случае, так как в этом случае ссылка на объект, которую это получает, является той же самой ссылкой на объект, сохраненной источником (то есть это не копия, прокси или отличный объект), таким образом, получатель должен обработать такую совместно используемую ссылку на объект по-другому в локальном случае следующим образом:
dropCompete то, что передача производится. (Отметьте, что источнику также мешают изменить состояние такого объекта после того, как это возвратило такой объект из, это getTransferData метод, до тех пор, пока это получает a dragDropEnd уведомление.)dropComplete и dragDropEnd методы были обработаны. После того семантика совместного использования является зависящей от реализации на совместно использованный объект (ы). dropComplete метод сигнализирует, что конец связанного перетаскивает и отбрасывает работу, и указывает на успех (или отказ) передач, выполняемых получателем. Вызов этого метода приводит к DragSourceListener's dragDropEnd метод, вызываемый с соответствующим состоянием, доступным от, это DragSourceDropEvent. Отказ вызвать этот метод приведет к перетаскиванию и отбросит работу, бывшую не в состоянии завершаться должным образом.
Многие GUI Components представляют "область просмотра" с возможностью прокрутки по (потенциально) большому набору данных. Во время работы перетаскивания и отбрасывания это является требуемым, чтобы быть в состоянии "автопрокрутить" такие "области просмотра", чтобы позволить пользователю перемещаться по такому набору данных, прокручивая, чтобы определить местоположение определенного элемента (первоначально не видимый через "область просмотра"), что они хотят отбросить предмет работы на.
Components, которые с возможностью прокрутки, обеспечивают, перетаскивают "автопрокрутку" поддержки их DropTarget реализовывая следующий интерфейс:
public interface Autoscroll {
Insets getAutoscrollInsets();
void autoScrollContent(Point cursorLocn);
}
Реализация DropTarget буду периодически вызывать autoscroll метод его связанного Component (если есть), передавая текущую логическую позицию курсора в Component координаты, когда следующие условия встречаются:
Component's видимая геометрия и граничная область, описанная Insets возвращенный getAutoscrollInsets метод.Если любое из вышеупомянутых условий прекращает быть допустимым, автопрокрутка должна завершиться, пока следующее условие инициирования не происходит.
Оба начальная задержка до автопрокрутки открытия, интервала между автопрокруткой уведомлений, и пиксельным значением гистерезиса внешне конфигурируема и может быть запрошена от Toolkit.getDesktopProperty метод.
В случае, где допустимое отбрасывание происходит, DropTargetListener's drop метод ответственен за обязательство передачи данных, связанных жестом. DropTargetDropEvent обеспечивает средство получить a Transferable объект, которые представляют тот объект (ы) данных, который будет передан.
От drop метод, DropTargetListener будет первоначально также rejectDrop (сразу возвращающийся после того) или acceptDrop определение выбранной работы от возвращенных getSourceActions.
Последующий за acceptDrop, но не прежде, getTransferable может быть вызван, и любые передачи данных, выполняемые через возвращенный Transferable's getTransferData метод. Наконец, как только место назначения отбрасывания завершило передачу (и) объектов из источника, из которого это должно сигнализировать успех, или непосредственный отказ, передачи () через вызов DropTargetContext.dropComplete.
После возврата из DropTargetContext.dropComplete метод Transferable и DragSourceContext экземпляры, как больше гарантируют, не будут допустимы, и все ссылки на них должны быть отброшены получателем, чтобы позволить им быть впоследствии собранными "мусор".
При использовании работы ACTION_REFERENCE источник и место назначения должны заботиться, чтобы согласовать объект и связанную семантику передачи. Обычно в передачах внутри-JVM живую ссылку на объект передали бы между источником и местом назначения, но в случае передач меж-JVM, или передачи между собственным и приложениями Java, живые ссылки на объект не имеют смысла, таким образом, некоторым другим 'ссылочным' типом нужно обменяться, такие как URI например. Оба DragSource и DropTarget может обнаружить, если передача является внутри-JVM или нет.
Все целевые платформы DnD представляют свои типы данных передачи, используя подобный механизм, однако представления действительно отличаются. Платформа Java использует типы MIME, инкапсулировавшие в пределах a DataFlavor представлять его типы данных. К сожалению, чтобы разрешить передачу данных между Java и платформой собственные приложения, существование этих имен платформы должно быть представлено, таким образом механизм требуется, чтобы создать расширяемое (независимое от платформы) отображение между этими именами зависимого типа платформы, их представлениями, и базируемым MIME Java DataFlavors.
Реализация обеспечит механизм, чтобы внешне определить отображение между платформой собственные типы данных (строки) и типами MIME (строки), используемые, чтобы создать DataFlavors. Это внешнее отображение будет использоваться базовой платформой определенный код реализации, чтобы представить соответствующее DataFlavors (Типы MIME), экспортируемый источником, месту назначения, через базовую платформу механизмы DnD.
Оба DragSource и DropTarget классы обеспечивают доступ для базовой системы, чтобы отобразить платформу зависимые имена к и от DataFlavors.
public interface java.awt.datatransfer.FlavorMap {
java.util.Map getNativesForFlavors(DataFlavor[] dfs);
java.util.Map getFlavorsForNatives(String[] natives);
}
getNativesForFlavors метод берет массив DataFlavors и возвраты a Map объект, содержащий нуль или больше ключей типа DataFlavor, от фактического параметра dfs, с присваиваемыми значениями типа String, которые соответствуют имени зависимого типа платформы для того типа MIME.
getFlavorsForNatives метод берет массив String типы и возвраты a Map объект, содержащий нуль или больше ключей типа String, от фактических уроженцев параметра, с присваиваемыми значениями типа DataFlavor, которые соответствуют независимому от платформы типу для того имени зависимого типа платформы.
Map объект, возвращенный обоими методами, может быть изменчив, но не обязан быть.
Если НУЛЬ передают к любому из этих методов, они должны возвратить свою текущую карту всех ключей и оценивают известный реализации во время вызова.
Например на Win32 Имя Формата Буфера обмена для простого текста является "CF_TEXT" (фактически, это - целое число 1), и на Мотиве это - Atom X11 под названием "СТРОКА", тип MIME, который можно использовать, чтобы представить, это было бы "текстом/плоскостью; charset=us-ascii". Поэтому переносимая платформа FlavorMap отобразился бы между этими именами; CF_TEXT на win32 и СТРОКА на Motif/X11.
Как правило, как реализовано в SystemFlavorMap эти отображения сохранены во внешнем персистентном формате конфигурации (файл свойств или URL) и загружаются из платформы, чтобы сконфигурировать FlavorMap соответственно для данной платформы.
SystemFlavorMap class обеспечивается, чтобы реализовать простое, платформа конфигурируемый механизм для того, чтобы определить набор в масштабе всей системы общих отображений, и определяется следующим образом:
public class java.awt.datatransfer.SystemFlavorMap implements FlavorMap, FlavorTable {
public static FlavorMap getSystemFlavorMap();
public synchronized Map getNativesForFlavors(DataFlavor[] dfs);
public synchronized Map getFlavorsForNatives(String[] natives);
public static String encodeDataFlavor(DataFlavor flav);
public static String encodeJavaMIMEType(String mimeType);
public static boolean isJavaMIMEType(String mimeStr);
public static String decodeJavaMIMEType(String nat);
public static DataFlavor decodeDataFlavor(String nat);
//...
}
SystemFlavorMap class обеспечивает простую реализацию, используя файл свойств (см. java.awt.Properties), персистентной платформы FlavorMap. Используя значение свойства AWT "AWT.flavorMapFileURL" (см. Toolkit.getProperty) или расположение файла по умолчанию System.getProperty("java.home") + File.separator + "lib" + File.separator + "flavormap.properties", этот class создает соответствующее Maps от свойств, найденных там.
Кроме того, class обеспечивает несколько статических функций удобства, используемых, чтобы закодировать и декодировать Java MimeTypes к и с платформы зависимое пространство имен. Синтаксис файла свойств:
{<platform_type_name> ‘=' <IETF_MIME_RFC_conformant_specification> <сш>} *
Реализации по умолчанию DragSource и DropTarget возвратитесь SystemFlavorMap от их getFlavorMap метод, если им не предоставили реализацию переопределения.
Так как одна из основных целей этого API состоит в том, чтобы позволить, перетаскивают и отбрасывание данных между Java и собственными приложениями, у этого есть некоторые существенные последствия на метод и механизм фактического кодирования данных и обмена, когда данные передают через границу виртуальной машины Java.
Так как один из участников такого обмена может быть собственным приложением, и таким образом не имеет никакого знания системы типов Java, система перетаскивания и отбрасывания не может просто обмениваться ссылкой на объект Java, так как у другого участника не может быть никакого знания, или возможность управлять таким типом.
Когда любой обмен происходит, он может только сделать так, независимо от реализации участников, если и только если оба участника согласовываются относительно знакомого типа данных и кодирования. Таким образом печально бремя обмена рождается главным образом участниками непосредственно.
Что это означает, на практике то, что для "собственных" форматов данных, таких как зависимое от платформы изображение, документ, или другие "Типы контента" кодирование и декодирование их связанного внешнего формата данных являются ответственностью источника и местом назначения передачи.
Система перетаскивания и отбрасывания должна представить внешнее представление таких "собственных" типов данных через границу виртуальной машины Java как инкапсулирующийся в пределах a java.io.InputStream или подкласс этого.
Это означает что любой DataFlavor с представлением class, который расширяется java.io.InputStream может быть передан, и будет представлен для передачи, через границу виртуальной машины Java.
Чтобы реализовать обмен таким собственным типом данных, разработчик определил бы a DataFlavor с MIME "Тип контента", который описывает природу "собственного" типа данных с представлением class, который расширяет a java.io.InputStream class, который кодирует данные, инкапсулировавшие в поток байтов.
В особенности такой InputStream подклассы должны реализовать следующую семантику:
java.io.InputStream. Условие этого конструктора подклассом java.io.InputStream позволит перетаскивание и отбросит систему (связанный с DropTarget) автоматически восстановить экземпляр представления class, определенный требуемым DataFlavor, и инициализируйте это с InputStream содержа инкапсулировавшие данные отформатирован согласно ожиданиям того подкласса. После того, как инициализированный этот экземпляр возвращается к вызывающей стороне Transferable.getTransferData метод, таким образом позволяя вызывающую сторону впоследствии перечитать и интерпретирует отформатированный контент переданного потока данных.
InputStream.read(byte b[], int off, int len).Условие этого метода (или наследование реализации суперклассов) включает системе перетаскивания и отбрасывания (связанный с DragSource) автоматически извлечь закодированный поток инкапсулировавших данных от Transferable, таким образом включая передаче данных через границу JVM как простой поток байтов просителю детали DataFlavor.
Типичным предметом передачи Перетаскивания и Отбрасывания является список одной или более платформ зависимые имена файлов. Чтобы ослабить задачу программирования разработчиков или создание или потребление таких списков, система перетаскивания и отбрасывания обрабатывает их как особый случай.
Если a DataFlavor определяется с MIME "Тип контента" application/x-java-file-list;class=java.util.List система перетаскивания и отбрасывания будет ожидать, что элементы списка будут гомогенным списком объектов типа java.io.File. Таким образом источник, поддерживая передачу списка файлов, должен создать такой List из File объекты, когда такой DataFlavor требуется, и получатель должен ожидать такой List из File объекты, если это запрашивает такое допустимое DataFlavor из его источника. Этот особый случай обеспечивает простой механизм для передачи списков файлов между источником и целью.
Возможно Перетащить и Отбросить ссылки на объект между JVM при использовании средств механизма RMI. Система Перетаскивания и Отбрасывания автоматически устроит передачу любой ссылки на объект, которая придерживается этих требований:
DataFlavor реализации оба java.rmi.Remote и java.io.Serializable. (MIME "Тип контента" может быть любым подходящим, произвольным типом или application/x-java-remote-object),
(эффективно объектная реализация переданный class должна быть расширена от java.rmi.server.UnicastRemoteObject так как система RMI реализует некоторую необходимую инициализацию, без которой передача не будет завершаться должным образом).
Если эти условия соблюдают, то если соответствующее DataFlavor требуется, тогда объект, возвращенный просителю (если это будет в JVM различия из источника), то будет ссылка RMI на экземпляр Remote возразите подынтерфейсу, определенному как представление class DataFlavor.
Из-за ограничений определенной базовой платформы перетаскивают и отбрасывают и реализации оконной системы, взаимодействие перетащить работы, и семантика поставки события к AWT Components зависимая платформа. Поэтому во время перетащить работы a DragSource может обработать События Оконной системы платформы, имеющие отношение, это перетаскивает исключая нормальную обработку событий.
Из-за взаимодействий между однопоточным центром проекта платформы собственные системы DnD, и собственными реализациями диспетчеризации события оконной системы в AWT, "обратными вызовами" в DropTargetListener и DragSourceListener произойдет или на, или синхронизировался с системным событием AWT, диспетчеризируют поток. Это поведение чрезвычайно нежелательно для соображений безопасности, но является реализацией, не архитектурной функцией, и неизбежно.
Чтобы включить внутри-JVM Перетаскивают и Передачи Отбрасывания существующее DataFlavor class будет расширен, чтобы позволить этому представить тип "живой" ссылки на объект, в противоположность Сериализированному (персистентному) представлению одного. Такие объекты могут быть переданы между источником и местом назначения в пределах той же самой JVM и ClassLoader контекст.
Тип контента MIME должен быть application/x-java-local-objectref.
Transferable объекты, их связанное DataFlavors', и объекты, которые инкапсулируют базовые данные, определенные как операнд (ы) перетаскивания, и отбрасывают работу, не должны остаться допустимыми до, по крайней мере, DragSourceListener связанный с DragSource управляя работой, получает a dragDropEnd. Время жизни предмета (ов) работы, переданной между источником и целью, является реализацией, определенной кроме того момент времени.
"Источник" успешного Перетаскивает и Отбрасывание (ACTION_MOVE), работа обязана удалять/оставлять все ссылки на объект (ы), которые являются предметом Transferable сразу после того, как передача была успешно завершена. Это прежде возвращается из DragSourceListener.dragDropEnd уведомление.
В результате существенного ввода от разработчиков к более ранней версии спецификации дополнительный тег работы/действия; ACTION_REFERENCE был добавлен, чтобы включать существующую платформу, Перетаскивают и семантика "Ссылки" Отбрасывания.
Считается, что Ссылка, или Ссылка, семантика уже достаточно плохо определяется для собственной платформы, Перетаскивают и Отбрасывание, чтобы представить это чрезвычайно бесполезный даже между собственными приложениями, таким образом между собственными и независимыми от платформы приложениями Java, которые это не рекомендуется.
Для Java к использованию Java необходимое семантическое; в пределах той же самой JVM /ClassLoader, определяется так, что, место назначения должно получить ссылку на объект Java на предмет (ы) передачи. Между JVM Java или ClassLoaders, семантическое является определенной реализацией, но могло быть реализовано посредством передачи или URL от источника до места назначения или RMI Remote ссылка.
Хотя не нормативная часть этой спецификации это определение включается для ясности:
public interface DropTargetPeer {
void addDropTarget(DropTarget dt);
void removeDropTarget(DropTarget dt);
}
Хотя не нормативная часть этой спецификации это определение включается для ясности:
public interface DragSourceContextPeer {
void startDrag(DragSourceContext dsc,
Cursor c,
Image di,
Point ioff
) throws InvalidDnDOperationException;
Cursor getCursor();
void setCursor(Cursor c) throws InvalidDnDOperationException;
void transferablesFlavorsChanged();
}
Хотя не нормативная часть этой спецификации это определение включается для ясности:
public interface DropTargetContextPeer {
int getTargetActions();
void setTargetActions(int actions);
DropTarget getDropTarget();
DataFlavor[] getTransferDataFlavors();
Transferable getTransferable() throws InvalidDnDOperationException;
boolean isTransferableJVMLocal();
void acceptDrag(int dragAction);
void rejectDrag();
void acceptDrop(int dropAction);
void rejectDrop();
void dropComplete(boolean success);
}