Drag & Drop komponentów między kontenerami

0

Witam,
jak przenieść komponenty między kontenerami, np. chwytam sobie cały JLabel i przenosze do innego komponentu.

Aktualnie moge przenosic tylko tekst i nie moge wykminić jak zrobić cały komponent.

JPanel left = new JPanel();
JPanel right = new JPanel();
JLabel b1 = new JLabel("Label");
...
left.add(b1);

//kod przenoszenia - Drag
b1.setTransferHandler(new TransferHandler("text")); //tu sie ustawia property które ma sie przenieść
b1.addMouseListener(new MouseListener(){
            public void mouseClicked(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {
                JComponent c = (JComponent) e.getSource();
                TransferHandler handler = c.getTransferHandler();
                handler.exportAsDrag(c, e, TransferHandler.COPY);
            }

            public void mouseReleased(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
        });

// Drop
right.setDropTarget(new DropTarget(right,new DropTargetListener(){
            public void dragEnter(DropTargetDragEvent dtde) {
                System.out.println("DragEnter");
            }

            public void dragOver(DropTargetDragEvent dtde) {
                System.out.println("DragOver");
            }

            public void dropActionChanged(DropTargetDragEvent dtde) {
                System.out.println("Change");
            }

            public void dragExit(DropTargetEvent dte) {
                System.out.println("DragExit");
            }

            public void drop(DropTargetDropEvent dtde) {
                System.out.println("Drop");
                System.out.println(dtde.getCurrentDataFlavors()[0]);
            }
        }));

Jak sie odpali i przeniesie System.out.println(dtde.getCurrentDataFlavors()[0]); zwraca namiary że przenoszony jest string czyli tekst Labela.

Jak zrobić by cały komponent przenosiło?

0

Hm... TransferHandler(String property) zamień na konstruktor bezparametrowy i wyrzuć linijkę wyżej. Następnie można użyć createTransferable(JComponent) i spróbować w ten sposób.

0

Już znalazłem jak :-) Teraz mam problem z oznaczaniem gdzie można Drop - pokazuje że wszędzie można. Chce zrobić by było można np. wszędzie prócz skąd jest brany obiekt. Do tego myśle by użyć getMouseLocation i zwraca położenie w oknie. Jak zatem dowiedzieć sie jakie jest położenie panelu w oknie? tzn jaki jest offset od lewego górnego rogu.

0

A zwykły mouselistener z reagowaniem na flagi "można/nie można" nie będzie prostszy?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.