Spec-Zone .ru
спецификации, руководства, описания, API
|
Теперь мы будем смотреть на демонстрационный пример, который использует пользовательский обработчик передачи, чтобы реализовать отбрасывание для компонента списка. Хотя обработчик передачи значения по умолчанию для списка реализует экспорт, потому что мы создаем пользовательский обработчик передачи, чтобы реализовать импорт, мы должны повторно реализовать экспорт также.
Поскольку Вы видите из снимка экрана, DropDemo
содержит доступную для редактирования текстовую область, список, и поле комбинированного списка, которое позволяет Вам выбирать режим отбрасывания для списка.
DropDemo
Сеть Java™ использования USE_SELECTION
работы и предусматриваются назад совместимость, но иначе не рекомендуются.ON
и попробуйте то же самое действие. Еще раз выбранный элемент списка заменяется, но текущий выбор не перемещается.INSERT
и повторите то же самое действие. Добавленный текст вставляется в расположении отбрасывания. В этом режиме не возможно изменить существующие элементы списка.ON_OR_INSERT
. В зависимости от позиции курсора можно или вставить новый текст, или можно заменить существующий текст.Вот
реализация для ListTransferHandler
.DropDemo.java
Обработчик передачи для этого списка поддерживает копию и перемещение, и это повторно реализует перетащить поддержку, которую список оказывает по умолчанию.
public class ListTransferHandler extends TransferHandler { private int[] indices = null; private int addIndex = -1; //Location where items were added private int addCount = 0; //Number of items added. /** * We only support importing strings. */ public boolean canImport(TransferHandler.TransferSupport info) { // Check for String flavor if (!info.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } return true; } /** * Bundle up the selected items in a single list for export. * Each line is separated by a newline. */ protected Transferable createTransferable(JComponent c) { JList list = (JList)c; indices = list.getSelectedIndices(); Object[] values = list.getSelectedValues(); StringBuffer buff = new StringBuffer(); for (int i = 0; i < values.length; i++) { Object val = values[i]; buff.append(val == null ? "" : val.toString()); if (i != values.length - 1) { buff.append("\n"); } } return new StringSelection(buff.toString()); } /** * We support both copy and move actions. */ public int getSourceActions(JComponent c) { return TransferHandler.COPY_OR_MOVE; } /** * Perform the actual import. This demo only supports drag and drop. */ public boolean importData(TransferHandler.TransferSupport info) { if (!info.isDrop()) { return false; } JList list = (JList)info.getComponent(); DefaultListModel listModel = (DefaultListModel)list.getModel(); JList.DropLocation dl = (JList.DropLocation)info.getDropLocation(); int index = dl.getIndex(); boolean insert = dl.isInsert(); // Get the string that is being dropped. Transferable t = info.getTransferable(); String data; try { data = (String)t.getTransferData(DataFlavor.stringFlavor); } catch (Exception e) { return false; } // Wherever there is a newline in the incoming data, // break it into a separate item in the list. String[] values = data.split("\n"); addIndex = index; addCount = values.length; // Perform the actual import. for (int i = 0; i < values.length; i++) { if (insert) { listModel.add(index++, values[i]); } else { // If the items go beyond the end of the current // list, add them in. if (index < listModel.getSize()) { listModel.set(index++, values[i]); } else { listModel.add(index++, values[i]); } } } return true; } /** * Remove the items moved from the list. */ protected void exportDone(JComponent c, Transferable data, int action) { JList source = (JList)c; DefaultListModel listModel = (DefaultListModel)source.getModel(); if (action == TransferHandler.MOVE) { for (int i = indices.length - 1; i >= 0; i--) { listModel.remove(indices[i]); } } indices = null; addCount = 0; addIndex = -1; } }
Затем мы смотрим на то, как цель может выбрать действие отбрасывания.