Переместить делегирующее событие drop в родительский контейнер - PullRequest
2 голосов
/ 26 января 2012

Я хочу делегировать событие "drop" для JList его родителю (JPanel) и удалить визуальную обратную связь о сбросе на JList.

Как правильно это сделать?

Я пытаюсь создать объект DropTarget и поделиться им между JPanel и JList, но это кажется немного хакерским - я не могу понять, что должен делать DropTarget.getComponent(), и беспокоюсь, что это может сломать .

Можете ли вы посоветовать правильный способ сделать это (в Java 6)?

EDIT: * Почему я это делаю? *

Я пытаюсь разрешить пользователю размещать элементы в группы (один JPanel + один JList = одна группа) - порядок списка не будет сохранен (и не может быть сохранен из-за некоторых внутренних структур данных), когда элемент сбрасывается на JList.

Визуальная обратная связь по умолчанию для JList - это курсор в виде линии, указывающий, где он будет добавлен. Если я использую значение по умолчанию, пользователь будет сбит с толку, когда обнаружит, что элемент добавлен в конец списка, а не там, где указывал курсор.

Чтобы визуальная обратная связь выглядела проще, я делаю это на уровне JPanel (один JPanel для одного JList, некоторое полупрозрачное наложение на список и прочее ...). Естественно, переход к этому JPanel должен также добавить в список. Так ....

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Если вам не нужно сохранять функцию перетаскивания JList, самый простой способ добиться этого - установить для TransferHandler значение null.Предполагая, что у его родителя установлен TransferHandler, он автоматически получит обработку событий перетаскивания.

1 голос
/ 27 января 2012

Визуальная обратная связь для местоположения отбрасывания обрабатывается средством визуализации ячеек. Грязный трюк для удаления - это пользовательский рендер, который ничего не делает в этом отношении (обратите внимание, что логика не завершена, вам, вероятно, придется обрабатывать «реальный» случай выбора):

    ListCellRenderer renderer = new DefaultListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(JList list,
                Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);
            JList.DropLocation dropLocation = list.getDropLocation();
            if (dropLocation != null
                    && !dropLocation.isInsert()
                    && dropLocation.getIndex() == index) {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            return this;
        }

    };

То, что в сочетании с пользовательским TransferHandler, который установлен как в списке, так и на панели, должно быть очень близко к тому, что вам нужно (в его importData добавьте элемент в конец списка, выберите новую запись и выделите это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...