Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перетаскивание компонент между контейнерами 
:(
    Опции темы
Turinets
Дата 15.3.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2009

Репутация: нет
Всего: нет



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

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

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

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);

    }
}


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

Можно конечно переводить координаты сначало в  абсолютные, а потом в координаты дерева, но мне кажется должен быть более простой и логичный способ это организовать.
PM MAIL   Вверх
Turinets
Дата 15.3.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2009

Репутация: нет
Всего: нет



Другими словами, хочу сделать так, чтобы можно было перетаскивать данные из одного контейнера в другой, по типу как перетаскивать файлы в виндовом окне. т.е. выделяешь их в одном окне, и перетаскиваешь в другое, при этом в том другом будет подсвечена папка в которую будут перенесены файлы, т.е. сами объекты второго окна реагируеют на движение мыши.
PM MAIL   Вверх
1024
Дата 16.3.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.12.2006

Репутация: 1
Всего: 1



для драгндропа есть несколько классов в пакете java.awt.dnd. Примеры можно гуглём посмотреть

http://www.exampledepot.com/

мышь для этого отслеживать не надо
PM MAIL   Вверх
Turinets
Дата 17.3.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2009

Репутация: нет
Всего: нет



Нет, народ, нужен пример конкретно по моей задачи.

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

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

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

Что имплементить и что наследовать?
PM MAIL   Вверх
1024
Дата 18.3.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.12.2006

Репутация: 1
Всего: 1



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

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

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

или скачать/купить книжку на русском по свингу, обычно примеры перетаскивания приводятся среди прочего
PM MAIL   Вверх
Turinets
Дата 18.3.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2009

Репутация: нет
Всего: нет



Пасиб, вроде начало проясняться.

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

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

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

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

Это сообщение отредактировал(а) Turinets - 18.3.2009, 21:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.