Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Drag and Drop


Автор: Reptor 20.8.2007, 14:30
Мне необходимо перетаскивать картинки и я вот увидел такой во пример.

http://blogs.sun.com/geertjan/entry/getting_around_isdragimagesupported_on_windows

можно ли помоч его разобрать так как я про эту технологию мало что знаю а с англ у меня туго?. А в этом примере происходит то что мне необходимо. 



Автор: Reptor 21.8.2007, 14:32
может есть на русском какое объяснение про Drag and Drop? или ещё какой пример хороший?

Автор: _Michael 21.8.2007, 14:50
Ты рисунки откуда хочеш перетаскивать? Откудато извне твоей аппликации или внутри, из JLabel например?

Автор: Reptor 21.8.2007, 14:51
_Michael,  Я хочу перетаскивать из  JLabel (JButton).

Автор: _Michael 21.8.2007, 18:36
Одним словом здесь в архиве плод моих творений, вроде разобрался более-менее. smile 
Полдня сидел думаю то что тебе надо smile

Автор: Reptor 21.8.2007, 18:48
_Michael, огромное спасибо буду смотреть  smile 

Автор: _Michael 21.8.2007, 19:16
 smile сначала скомпилируй запусти посмотри то ли что тебе надо. а потом если че не ясно спрашивай 

Автор: Reptor 22.8.2007, 18:10
_Michael, похоже то что надо только небольшое уточнение в том что я беру с кнопки картинку и перетаскиваю её на произвольное место на JPanel.

Добавлено через 33 секунды
А в примере вроде есть только одна точка в которую можно перетащить

Добавлено через 2 минуты и 56 секунд
но это уже молочи ещё раз огромнейшее тебе спасибо _Michael,   smile  я думаю с меня плюс

Добавлено через 3 минуты и 37 секунд
да снова забыл если что будет не ясно то я обязательно обращюсь  smile 

Автор: _Michael 22.8.2007, 21:37
Цитата(Reptor @  22.8.2007,  18:10 Найти цитируемый пост)
_Michael, похоже то что надо только небольшое уточнение в том что я беру с кнопки картинку и перетаскиваю её на произвольное место на JPanel.

Добавлено через 33 секунды
А в примере вроде есть только одна точка в которую можно перетащить

Ну сам понимаеш что тут господствует LayoutManager который ты установил для своей панели, ет не так просто, ну а может я просто неумею smile но у меня на работе вроде как есть пример с перетаскиванием в любое место, завтра посмотрю

Цитата(Reptor @  22.8.2007,  18:10 Найти цитируемый пост)
я думаю с меня плюс

Было б очень кстати smile жду не дождусссь smile приятно что мой пример тебе помог smile

Цитата(Reptor @  22.8.2007,  18:10 Найти цитируемый пост)
да снова забыл если что будет не ясно то я обязательно обращюсь    
 чем сможем тем поможем smile

Автор: _Michael 23.8.2007, 12:46
Чтоб иконка была в любом месте, делаем минимальные изменения, а именно, DropTarget вешаем теперь не на JLabel а на панель на которой лежит етот наш JLabel чтоб можна было "дропать" в любом месте Панели
Код

//        Вот так было
//        label1 = new JLabel("Destination", SwingConstants.LEADING);
//        label1.setDropTarget(dt);
//        JPanel panel1 = new JPanel(new GridLayout(1, 1));
//        Вместо етого делаем так 
        label1 = new JLabel();//"Destination", SwingConstants.LEADING);
        JPanel panel1 = new JPanel();//new GridLayout(1, 1));
        panel1.setDropTarget(dt);
        TitledBorder t1 = BorderFactory.createTitledBorder("Drop anywhere here");
        panel1.add(label1);
        panel1.setBorder(t1);


и второе изменение, в методе public void drop(DropTargetDropEvent e) дописываем одну строчку, точнее две
Код

        public void drop(DropTargetDropEvent e) {
                        ......
// Вот так было но помним что мы повешали DropTarget на панель а не на JLabel поетому ети строки неверно.
//            JLabel c = (JLabel) source.getComponent();
//            c.setIcon((Icon) data);

            label1.setIcon((Icon) data);
            label1.setLocation(e.getLocation());
                }


Автор: Reptor 7.9.2007, 13:23
Вот у меня ещё одна проблема возникла а состоит она в следующем:
 когда мы перетягиваем картинку то я так понял мы ее цепляем на уже сущуствующий Label (ну тот который на панели) собственно вот жта часть 
   
Код

public void drop(DropTargetDropEvent e) {    
                        ......    

            label1.setIcon((Icon) data);    
            label1.setLocation(e.getLocation());    
                }


а можно ли как то делать это на панели ? может как то картинку рисовать или ещё что я вчера пробовал так и нечё не получилось. Просто я зделал 2 лабел с картинками и я сначала тащу с одной а потом с 2-ой и они друг друга перетирают. А надо что б их 2 оставалось. 
Как это можно реализовать? 

Я предпалпгаю надо как то рисовать её на панели (создавать или ещё както) и делать массив вот этих кртинок DataFlavor я точно не знаю так как толком ещё мало понимаю весь процесс.

Автор: Reptor 8.9.2007, 21:11
 smile  вроде как данная проблема решилась. Просто создавал всегда лабел и использовал 
Код

setLayout(null)

Автор: Reptor 12.9.2007, 12:01
Ещё есть один вопрос а как сделать так что б когда при перетаскивании картинки картинка с источника исчезала?

Автор: Reptor 12.9.2007, 15:14
зделал следующим образом и работает нормально 
Код


class DSListener implements DragSourceListener {

        /**
         * @param e the event
         */
        public void dragDropEnd(DragSourceDropEvent e) {

            if (e.getDropSuccess() == false) {
                System.out.println("not successful");
                DragLabel.this.setVisible(false);                         // VOT TYT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                return;
            }

            /*
             * the dropAction should be what the drop target specified
             * in acceptDrop
             */
            System.out.println("dragdropend action " + e.getDropAction());

            // this is the action selected by the drop target
            if (e.getDropAction() == DnDConstants.ACTION_MOVE)
                DragLabel.this.setText("");
        }


в классе DropLabel  и его внутренем классе DSListener в методе dragDropEnd зделал DragLabel.this.setVisible(false);   и хотел уточнить насколько это верно и не критично может более правильно в другом месте это делать и как то по другому? Может как то удалять картинку с DropLabel или ещё как?  smile 

Автор: _Michael 12.9.2007, 16:35
Ну если так подумать, то наверное метод public void dragDropEnd(DragSourceDropEvent e) для того и предназначем чтоб отлавливать завершение етого всего процесса. Не знаю но если тебе етого DragLabel больше не надо ведь фактически то ета DragLabel и служила для единственной цели служить источником картинки, и если ты картинку перетащил уже то можно ету DragLabel  вообще убрать из панели чтоб ее сборщик мусора "утилизировал" smile а не просто setVisible(false)

Автор: Reptor 12.9.2007, 16:37
Цитата

 и если ты картинку перетащил уже то можно ету DragLabel  вообще убрать из панели чтоб ее сборщик мусора "утилизировал"  а не просто setVisible(false)


Вот так как это реализовать?

Автор: _Michael 12.9.2007, 16:38
Цитата(Reptor @  12.9.2007,  15:14 Найти цитируемый пост)
Может как то удалять картинку с DropLabel или ещё как? 

Ты наверное сплутал DragLabel  с DropLabel или я чтото не понимаю. smile

Добавлено @ 16:39
ну есть же такой метод remove(Component comp); 

Код

......
panel.remove(DragLabel.this); // панель где лежит твоя DragLabel
......


Както так и не забудь если где то ссилки на ету Jlabel есть также их сделать null'ами

Автор: Reptor 12.9.2007, 16:41
_Michael, ой DropLabel - это опечатка я имел ввиду DragLabel

Добавлено через 3 минуты и 23 секунды
да делаю 
Код

remove(DragLabel.this);
 

нечего не происходит. Как быть?

Автор: _Michael 12.9.2007, 16:47
Надо еще валидейт и репеинт может чтото одно не знаю точно.
Код

panel.remove(Draglabel.this);
panel.validate();
panel.repaint();        

Автор: Reptor 12.9.2007, 16:47
подожди что то я запутался 

panel.remove(DragLabel.this);

но ведь панел я не знаю мне она не доступна или как к ней достучаться из dragDropEnd

Автор: _Michael 12.9.2007, 16:48
Надо еще валидейт и репеинт может чтото одно не знаю точно.
Код

panel.remove(Draglabel.this);
panel.validate();
panel.repaint();        


Добавлено @ 12:57
Попробуй взять парента, и посмотреть может ето она как раз.
Код

DragLabel label = (DragLabel)e.getSource(); // если не ошыбаюсь ето должна быть ета твоя DragLabel. Но проверь!
Container cont = label.getParent();
cont.remove(label);
cont.validate();
cont.repaint();

или
Код

Container cont = DragLabel.this.getParent();
cont.remove(DragLabel.this);
cont.validate();
cont.repaint();

Автор: newsl 8.9.2011, 10:54
мине необхадимо переключится на ДнД в процессе простого передвижения компонанта по панели тоесть , когда просто предевигаю компонент в приделах  панели то просто перерисововаю его на позицию курсора когдаже компонент зашол полностю за краи фреима то надо включить ДнД проблема в том что когда перетаскиваю просто по панели и подовлаю ДнД то неудаётся отослать ешё один event когда зашол за краи , как создать такои event и отослать нужному обработчикку низнаю помагите у каво есть харошие идеи по этому поводу ибо очен надо причом срочно ! ?

Добавлено через 1 минуту и 45 секунд
была идея както создать собственый DragGestureEvent толко вот как и как отослат низнаю :( если вообше такое вазможно

Добавлено через 7 минут и 6 секунд
Цитата(Reptor @ 12.9.2007,  12:01)
Ещё есть один вопрос а как сделать так что б когда при перетаскивании картинки картинка с источника исчезала?

попробуи это 

oldFrame.getContentPane().validate();
oldFrame.getContentPane().repaint();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)