Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Перетащите и Отбросьте и Передача данных
Раздел: Выбор Действия Отбрасывания
Демонстрационный пример - ChooseDropAction
Домашняя страница > Создание GUI С JFC/Swing > Перетащите и Отбросьте и Передача данных

Демонстрационный пример - ChooseDropAction

Следующий демонстрационный пример, ChooseDropActionDemo, содержит три списка. Как можно видеть в снимке экрана, список слева, маркированный "Перетаскивают отсюда", перетащить источник. Этот список поддерживает и перемещение и копию, но это не реализует импорт — таким образом, невозможно заскочить в это.

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

Снимок демонстрационного примера ChooseDropActionDemo.

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать ChooseDropActionDemo Сеть Java™ использования Запускается (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ChooseDropActionDemo
  2. Выберите элемент в источнике, перечисляют и перетаскивают к верхнему целевому списку. Поскольку Вы перетаскиваете по цели, заметьте, что курсор мыши отбрасывания копии выводит на экран, даже если Вы не содержите Клавишу CTRL, чтобы показать, что Вы хотите действие копии. (Отметьте, что курсор копии не появляется на платформе Macintosh, если Вы не нажимаете функциональную клавишу.)
  3. Отбросьте элемент. Это вставляется в целевой список, но не удаляется из источника — как требующийся.
  4. Перетащите снова от исходного списка, но на сей раз в более низкий целевой список. Отбросьте элемент. Это вставляется в целевой список и удаляется из исходного списка.
  5. Выберите другой элемент в исходном списке и, нажимая Клавишу CTRL, чтобы указать на предпочтение действию КОПИИ, перетащите элемент к более низкому целевому списку.
  6. Бросьте элемент в список. Элемент не вставляется — отбрасывание отклоняется. canImport метод для обработчика передачи был кодирован, чтобы отклонить действие КОПИИ, но это, возможно, было реализовано, чтобы возвратить true, когда пользовательское действие будет преобладать, и копия произошла бы.

Поскольку Вы могли бы предположить, ChooseDropActionDemo.java пример содержит два TransferHandler реализации:

/**
 * 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, присоединенный и к только для перемещения и к целевому списку только для копии, содержит конструктора, который определяет, позволит ли целевой список только копию или только переместится. Экземпляр, который поддерживает действие копии, присоединен к списку только для копии и экземпляру, который поддерживает действие перемещения, присоединен к списку только для перемещения.

Вы могли бы также интересоваться Высокоуровневым примером Отбрасывания, который также иллюстрирует выбор действия отбрасывания.

Затем мы смотрим на показ расположения отбрасывания.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Выбор Действия Отбрасывания
Следующая страница: Показ Расположения Отбрасывания