|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующий демонстрационный пример, ChooseDropActionDemo, содержит три списка. Как можно видеть в снимке экрана, список слева, маркированный "Перетаскивают отсюда", перетащить источник. Этот список поддерживает и перемещение и копию, но это не реализует импорт — таким образом, невозможно заскочить в это.
На правой стороне два списка, которые действуют как цели отбрасывания. Главный список, маркированное "Отбрасывание, чтобы СКОПИРОВАТЬ здесь" только позволит данным быть скопированными в это. Нижний список, маркированное "Отбрасывание, чтобы ПЕРЕМЕСТИТЬСЯ сюда" только позволит данным быть перемещенными в это. Исходный список только позволяет данным быть перетащенными от этого.

ChooseDropActionDemo Сеть Java™ использования (). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.canImport метод для обработчика передачи был кодирован, чтобы отклонить действие КОПИИ, но это, возможно, было реализовано, чтобы возвратить true, когда пользовательское действие будет преобладать, и копия произошла бы.Поскольку Вы могли бы предположить,
/**
* The FromTransferHandler allows dragging from the list and
* supports both copy and move actions. This transfer handler
* does not support import.
*/
class FromTransferHandler extends TransferHandler {
public int getSourceActions(JComponent comp) {
return COPY_OR_MOVE;
}
private int index = 0;
public Transferable createTransferable(JComponent comp) {
index = dragFrom.getSelectedIndex();
if (index < 0 || index >= from.getSize()) {
return null;
}
return new StringSelection((String)dragFrom.getSelectedValue());
}
public void exportDone(JComponent comp, Transferable trans, int action) {
if (action != MOVE) {
return;
}
from.removeElementAt(index);
}
}
/**
* The ToTransferHandler has a constructor that specifies whether the
* instance will support only the copy action or the move action.
* This transfer handler does not support export.
*/
class ToTransferHandler extends TransferHandler {
int action;
public ToTransferHandler(int action) {
this.action = action;
}
public boolean canImport(TransferHandler.TransferSupport support) {
// for the demo, we will only support drops (not clipboard paste)
if (!support.isDrop()) {
return false;
}
// we only import Strings
if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
// check if the source actions contain the desired action -
// either copy or move, depending on what was specified when
// this instance was created
boolean actionSupported = (action & support.getSourceDropActions()) == action;
if (actionSupported) {
support.setDropAction(action);
return true;
}
// the desired action is not supported, so reject the transfer
return false;
}
public boolean importData(TransferHandler.TransferSupport support) {
// if we cannot handle the import, say so
if (!canImport(support)) {
return false;
}
// fetch the drop location
JList.DropLocation dl = (JList.DropLocation)support.getDropLocation();
int index = dl.getIndex();
// fetch the data and bail if this fails
String data;
try {
data = (String)support.getTransferable().getTransferData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException e) {
return false;
} catch (java.io.IOException e) {
return false;
}
JList list = (JList)support.getComponent();
DefaultListModel model = (DefaultListModel)list.getModel();
model.insertElementAt(data, index);
Rectangle rect = list.getCellBounds(index, index);
list.scrollRectToVisible(rect);
list.setSelectedIndex(index);
list.requestFocusInWindow();
return true;
}
}
FromTransferHandler, присоединенный к исходному списку, учитывает перетаскивание от списка и поддерживает и копию и действия перемещения. Если Вы попытаетесь отбросить на этот список, то отбрасывание будет отклонено потому что FromTransferHandler не реализовал canImport и importData методы.
ToTransferHandler, присоединенный и к только для перемещения и к целевому списку только для копии, содержит конструктора, который определяет, позволит ли целевой список только копию или только переместится. Экземпляр, который поддерживает действие копии, присоединен к списку только для копии и экземпляру, который поддерживает действие перемещения, присоединен к списку только для перемещения.
Вы могли бы также интересоваться Высокоуровневым примером Отбрасывания, который также иллюстрирует выбор действия отбрасывания.
Затем мы смотрим на показ расположения отбрасывания.