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

CCP в F нетекстовом Компоненте

Если Вы реализуете сокращение, копию и вставку, используя один из компонентов Swing, который не является одним из текстовых компонентов, необходимо сделать некоторую дополнительную установку. Во-первых, Вы должны установить сокращение, копию, и действия вставки в карте действия. Следующий метод показывает, как сделать это:

    private void setMappings(JList list) { 
        ActionMap map = list.getActionMap();
        map.put(TransferHandler.getCutAction().getValue(Action.NAME),
                TransferHandler.getCutAction());
        map.put(TransferHandler.getCopyAction().getValue(Action.NAME),
                TransferHandler.getCopyAction());
        map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
                TransferHandler.getPasteAction());

Когда Вы устанавливаете меню Edit, можно также хотеть добавлять акселераторы меню, так, чтобы пользователь мог ввести Ctrl-C, чтобы инициировать копию, например. В следующем фрагменте кода полужирный текст показывает, как установить акселератор меню для действия сокращения:

    menuItem = new JMenuItem("Cut");
    menuItem.setActionCommand((String)TransferHandler.getCutAction().
             getValue(Action.NAME));
    menuItem.addActionListener(actionListener);
    menuItem.setAccelerator(
      KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
    menuItem.setMnemonic(KeyEvent.VK_T);
    mainMenu.add(menuItem);

Если Вы установили акселераторы меню для действий CCP, этот следующий шаг избыточен. Если Вы не установили акселераторы меню, Вы должны добавить привязку CCP к входной карте. Следующий фрагмент кода показывает, как это делается:

    // only required if you have not set the menu accelerators
    InputMap imap = this.getInputMap();
    imap.put(KeyStroke.getKeyStroke("ctrl X"),
        TransferHandler.getCutAction().getValue(Action.NAME));
    imap.put(KeyStroke.getKeyStroke("ctrl C"),
        TransferHandler.getCopyAction().getValue(Action.NAME));
    imap.put(KeyStroke.getKeyStroke("ctrl V"),
        TransferHandler.getPasteAction().getValue(Action.NAME));

Как только привязка была установлена, и меню Edit было установлено, есть другая проблема, которая будет адресоваться: Когда пользователь инициирует сокращение, копию или вставку, какой компонент должен получить действие? В случае текстового компонента, DefaultEditorKit помнит, у какого последнего компонента были фокус и вперед действие к тому компоненту. Следующий class, TransferActionListener, выполняет ту же самую функцию для нетекста компоненты Swing. Этот class может быть брошен в большинство любого приложения:

public class TransferActionListener implements ActionListener,
                                              PropertyChangeListener {
    private JComponent focusOwner = null;

    public TransferActionListener() {
        KeyboardFocusManager manager = KeyboardFocusManager.
           getCurrentKeyboardFocusManager();
        manager.addPropertyChangeListener("permanentFocusOwner", this);
    }

    public void propertyChange(PropertyChangeEvent e) {
        Object o = e.getNewValue();
        if (o instanceof JComponent) {
            focusOwner = (JComponent)o;
        } else {
            focusOwner = null;
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (focusOwner == null)
            return;
        String action = (String)e.getActionCommand();
        Action a = focusOwner.getActionMap().get(action);
        if (a != null) {
            a.actionPerformed(new ActionEvent(focusOwner,
                                              ActionEvent.ACTION_PERFORMED,
                                              null));
        }
    }
}

Наконец, необходимо решить, как обработать вставку. В случае перетаскивания и отбрасывания, Вы вставляете данные в расположении отбрасывания. В случае вставки Вы не обладаете преимуществом пользователя, указывающего на требуемое расположение вставки. Вы должны решить то, что имеет смысл для Вашего приложения — вставка данных прежде или после того, как текущий выбор мог бы быть лучшим решением.

Следующий демонстрационный пример, ListCutPaste, показывает, как реализовать CCP в экземпляре JList. Как можно видеть в снимке экрана есть три списка, и можно сократить, скопировать, и вставить к или от любого из этих списков. Они также поддерживают, перетаскивают и отбрасывают. Для этого демонстрационного примера вставляемые данные вставляются после текущего выбора. Если нет никакого текущего выбора, данные добавляются до конца списка.

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

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, ListCutPaste, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример ListCutPaste
  2. Выберите элемент в одном из списков. Используйте меню Edit или клавиатуру, эквивалентную сокращению, или скопируйте элемент списка с источника.
  3. Выберите элемент списка, где Вы хотите, чтобы элемент был вставлен.
  4. Вставьте текст, используя меню или эквивалентную клавиатуру. Элемент вставляется после текущего выбора.
  5. Выполните то же самое использование работы, перетаскивают и отбрасывают.


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

Предыдущая страница: CCP в текстовом Компоненте
Следующая страница: Используя и Создание DataFlavor