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


Автор: Turinets 15.3.2009, 15:52
Народ. Просто перетаскивать компонент по контейнеру я умею. Проблема вот в чём, есть скажем контайнер данных (дерево) и есть рядом панель с объектами.  Для появлении нового объекта на дереве нужно проделать такие манипуляции: на панели выбрать нужный элемент и зажав мышь перетащить на дерево (и отпустить). Хотелось бы, чтобы данные на подствечивались при наведении на них объекта, ну типа подсветится тот узел в который будет добавлен новый объект. Для этих целей нужно обрабатывать движение мыши.

Проблема: если зажать кнопку на панели, то будут обрабатываться листнеры этой самой панели, а мне надо, чтобы обрабатывались движение мыши по дереву.

Происходит дело так:
Код

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class CursorFrame extends JFrame {

    JPanel right = new JPanel();
    JPanel center = new JPanel(new FlowLayout(FlowLayout.LEFT, 150, 40));
    JLabel lab1 = new JLabel("Kaligula");
    JLabel lab2 = new JLabel("ImpireBuilding");
    JLabel lab3 = new JLabel("CanadaMather");
    Object lastselected = null;
    boolean isMoved = false;
    boolean isCursor = false;
    long timePressed = 0;
    Object clickedObject = null;

    public CursorFrame() throws HeadlessException {
        this.setTitle("Cursor it");
        this.setBounds(100, 100, 450, 350);
        this.getContentPane().setLayout(new BorderLayout());

        right.setBackground(Color.PINK);

        center.add(lab1);
        center.add(lab2);
        center.add(lab3);

        center.setBackground(Color.GRAY);
        this.getContentPane().add(right, BorderLayout.EAST);
        this.getContentPane().add(center, BorderLayout.CENTER);
        right.setPreferredSize(new Dimension(100, 100));

        this.addMouseMotionListener(new MouseMotionListener() {

            public void mouseDragged(MouseEvent e) {
                System.out.println("gets");
                if (isMoved) {
                    JLabel thisget = null;
                    if (lab1.getBounds().contains(e.getPoint())) {
                        System.out.println("Lab1");
                    }

                }
            }
            public void mouseMoved(MouseEvent e) {
            }
        });
        right.addMouseMotionListener(new MouseMotionListener() {

            public void mouseDragged(MouseEvent e) {
                if (isMoved) {
                    if ((!isCursor) && (System.currentTimeMillis() - timePressed > 150)) {
                        isCursor = true;
                        setCursor(Cursor.MOVE_CURSOR);
                    }

                }
            }
            public void mouseMoved(MouseEvent e) {
            }
        });

        right.addMouseListener(new MouseListener() {

            public void mouseClicked(MouseEvent e) {
            }

            public void mousePressed(MouseEvent e) {
                // getObject
                isMoved = true;
                lastselected = null;
                timePressed = System.currentTimeMillis();
            }

            public void mouseReleased(MouseEvent e) {
                isMoved = false;
                isCursor = false;
                setCursor(Cursor.DEFAULT_CURSOR);
            }

            public void mouseEntered(MouseEvent e) {
            }

            public void mouseExited(MouseEvent e) {
            }
        });
    }
    static public void main(String arg[]) {
        CursorFrame c = new CursorFrame();
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setVisible(true);

    }
}


В момет зажатия кнопки запоминается нужный тип объекта (в будущем он будет вычисляться исходя из координат клика), курсор меняет вид... когда происходит отпускание (опять же в будущем) будет взят правильный узел и в него помещён объект (тип которого сохранёт). Задача такова на данный момент: нудно, чтобы при движении изменённого курсора подсвечивался нуждый элемент (который под ним) - метка. 

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

Автор: Turinets 15.3.2009, 16:36
Другими словами, хочу сделать так, чтобы можно было перетаскивать данные из одного контейнера в другой, по типу как перетаскивать файлы в виндовом окне. т.е. выделяешь их в одном окне, и перетаскиваешь в другое, при этом в том другом будет подсвечена папка в которую будут перенесены файлы, т.е. сами объекты второго окна реагируеют на движение мыши.

Автор: 1024 16.3.2009, 01:30
для драгндропа есть несколько классов в пакете java.awt.dnd. Примеры можно гуглём посмотреть

http://www.google.com/custom?domains=exampledepot.com&q=drag&sa=Google+Search&sitesearch=exampledepot.com&client=pub-6001183370374757&forid=1&ie=ISO-8859-1&oe=ISO-8859-1&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23336699%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3A336699%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BFORID%3A1%3B&hl=en

мышь для этого отслеживать не надо

Автор: Turinets 17.3.2009, 21:44
Нет, народ, нужен пример конкретно по моей задачи.

Либо отсутствует описание, либо решается другая задача. Всё что я просмотрел мне не помогло.

Как с помощью этой библиотеки (пакета) организовать перетаскивание объекта из одного контейнера в другой до меня не доходит. Плиз, более детальный ответ без отправления меня через тридевять земель по сылкам. Какой класс должен какой класс наследовать и имплементить? Нифигпа не понятно.

Есть LeftPanel - панель от которой надо вести перетаскивание. Важно только изнать координаты в момент нажатия.
Есть RightPanel - панель (которая как бы дерево в будушем), куда надо перетащить. Соответственно важно, чтобы фиксировался момент отпускания кнопки + движение мыши по RightPanel.]

Что имплементить и что наследовать?

Автор: 1024 18.3.2009, 18:38
тебе ж говорят: координаты не нужны. Есть стандартная реализация драгндропа.

вот стандартный пример http://java.sun.com/docs/books/tutorial/uiswing/dnd/basicdemo.html

можно запустить и поперетаскивать
можно скачать код примера и посмотреть

или скачать/купить книжку на русском по свингу, обычно примеры перетаскивания приводятся среди прочего

Автор: Turinets 18.3.2009, 20:40
Пасиб, вроде начало проясняться.

Книгу читать, ради дропа... хм. Мне ответ быстро нужен.

Пример кстатии хороший.

Чтобы добить вопрос.
Как я понял, включения механизма в компоненте даёт такой эффект: Если этот компонент не принимает дроп, то курсор становиться перечёркнутым кругом. Нужно сделать так:

Есть панель - палитра, если захваченный элемент был взят с этой палитры (т.е. является определённым классом), то курсор над этой панелью должен принимать определённый вид. Сама же палитра тока отдаёт объекты , но не принимает. Как программировать смену курсора при возникновении dnd события? Хотя с другой стороны палитру можно сделать как принимающий компонент, тока в процессе приема ничего не происходит. Но всёже как быть с курсором?

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