|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Мы показали, как реализовать, перетаскивают и отбрасывают поддержку и как реализовать сокращение, копию, поддержку вставки. Как Вы комбинируете обоих в одном компоненте?
Вы реализуете обоих в пределах TransferHandler's importData метод, как это:
if (transferSupport.isDrop()) {
// put data in transferSupport.getDropLocation()
} else {
// determine where you want the paste to go (ex: after current selection)
// put data there
}
ListCutPaste пример, обсужденный на CCP в F нетекстовой Компонентной странице, поддерживает и dnd и ccp. Вот importData метод ( if-else логика отбрасывания является полужирной):
public boolean importData(TransferHandler.TransferSupport info) {
String data = null;
//If we cannot handle the import, bail now.
if (!canImport(info)) {
return false;
}
JList list = (JList)info.getComponent();
DefaultListModel model = (DefaultListModel)list.getModel();
//Fetch the data -- bail if this fails
try {
data = (String)info.getTransferable().getTransferData(DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException ufe) {
System.out.println("importData: unsupported data flavor");
return false;
} catch (IOException ioe) {
System.out.println("importData: I/O exception");
return false;
}
if (info.isDrop()) { //This is a drop
JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
int index = dl.getIndex();
if (dl.isInsert()) {
model.add(index, data);
return true;
} else {
model.set(index, data);
return true;
}
} else { //This is a paste
int index = list.getSelectedIndex();
// if there is a valid selection,
// insert data after the selection
if (index >= 0) {
model.add(list.getSelectedIndex()+1, data);
// else append to the end of the list
} else {
model.addElement(data);
}
return true;
}
}
Это - единственное место, где Вы должны установить if-else логика, чтобы различить dnd и ccp.