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

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

Теперь мы будем смотреть на демонстрационный пример, который использует пользовательский обработчик передачи, чтобы реализовать отбрасывание для компонента списка. Хотя обработчик передачи значения по умолчанию для списка реализует экспорт, потому что мы создаем пользовательский обработчик передачи, чтобы реализовать импорт, мы должны повторно реализовать экспорт также.

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

Снимок экрана DropDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать DropDemo Сеть Java™ использования Запускается (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример DropDemo
  2. Выберите некоторый текст в текстовой области и отбрасывании на список. Выбранная запись списка заменяется, и тот элемент становится текущим выбором. Это то, как USE_SELECTION работы и предусматриваются назад совместимость, но иначе не рекомендуются.
  3. Измените Режим Отбрасывания Списка на ON и попробуйте то же самое действие. Еще раз выбранный элемент списка заменяется, но текущий выбор не перемещается.
  4. Измените Режим Отбрасывания Списка на INSERT и повторите то же самое действие. Добавленный текст вставляется в расположении отбрасывания. В этом режиме не возможно изменить существующие элементы списка.
  5. Измените Режим Отбрасывания Списка на 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;
    }
}

Затем мы смотрим на то, как цель может выбрать действие отбрасывания.


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

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