Как сделать так, чтобы этот mouselistener заботился только об одном объекте? - PullRequest
0 голосов
/ 28 февраля 2010

Я работаю над этими онлайн-уроками Стэнфорда по Java, и мы только что совершили прыжок к событиям, и мне трудно обернуть голову вокруг этого. Я играю с программой из книги «Искусство и наука о Java». Эта программа будет перемещать прямоугольник и овал на холсте, если вы нажмете на них.

Я изменил метод run, чтобы попытаться заставить слушателя работать только с прямоугольником, но я был удивлен, увидев, что даже при моих изменениях оба объекта прослушиваются ... почему?

Оригинальный метод запуска:

public void run() {
    GRect rect = new GRect(100, 100, 150, 100);
    rect.setFilled(true);
    rect.setColor(Color.RED);
    add(rect);
    GOval oval = new GOval(300, 115, 100, 70);
    oval.setFilled(true);
    oval.setColor(Color.GREEN);
    add(oval);
    addMouseListeners();
}

Моя измененная программа (с MouseListener в закрытом методе createRectangle):

import java.awt.*;
import java.awt.event.*;
import acm.graphics.*;
import acm.program.*;

/** This class displays a mouse-draggable rectangle and oval */

public class DragObjects extends GraphicsProgram {


    public void run() {
        createRectangle();
        createOval();

    }

    private void createOval(){

        GOval oval = new GOval(300, 115, 100, 70);
        oval.setFilled(true);
        oval.setColor(Color.GREEN);
        add(oval);

    }

    private void createRectangle(){

        GRect rect = new GRect(100, 100, 150, 100);
        rect.setFilled(true);
        rect.setColor(Color.RED);
        add(rect);
        addMouseListeners();
    }

/** Called on mouse press to record the coordinates of the click */
    public void mousePressed(MouseEvent e) {
        lastX = e.getX();
        lastY = e.getY();
        gobj = getElementAt(lastX, lastY);
    }

/** Called on mouse drag to reposition the object */
    public void mouseDragged(MouseEvent e) {
        if (gobj != null) {
            gobj.move(e.getX() - lastX, e.getY() - lastY);
            lastX = e.getX();
            lastY = e.getY();
        }
    }

/** Called on mouse click to move this object to the front */
    public void mouseClicked(MouseEvent e) {
        if (gobj != null) gobj.sendToFront();
    }

/* Instance variables */
private GObject gobj;   /* The object being dragged */
private double lastX;   /* The last mouse X position */
private double lastY;   /* The last mouse Y position */
}

Ответы [ 3 ]

2 голосов
/ 28 февраля 2010

Было бы полезно указать, что метод addMouseListeners() находится в суперклассе GraphicsProgram. Он добавляет слушателя к canvas , а не только к индивидуальной форме. Оттуда вам нужно будет каким-то образом определить, произошел щелчок мышью в прямоугольнике или в овале.

Или может быть способом добавить слушателя только к одной фигуре. Проверьте Javadoc для классов GRect и GOval. Я предполагаю, что они также находятся в одном из пакетов acm. *, Что означает, что они не встроены в язык Java. (Вот почему я рекомендую использовать IDE, такую ​​как Eclipse, которая может автоматически импортировать каждый класс вместо импорта всего пакета.)

Также может быть полезно опубликовать ссылку на онлайн-уроки, которые вы читаете.

1 голос
/ 28 февраля 2010

Я не смотрел на источник, кроме того, что вы опубликовали. Но вам нужно будет изменить gOval и gRect или суперкласс, чтобы принять mouseListener, или в вашем слушателе сделать что-то вроде следующего.

в методах MouseClicked, MouseMoved и т. Д. Получить точку события, а затем пройти через ваши объекты и запросить их, чтобы увидеть, существует ли точка в пределах своих границ.

Вам потребуется список объектов для циклического прохождения, а затем вызовите что-то вроде gRect.containsPoint (myPoint) в этом методе, чтобы проверить, существует ли точка в форме. У вас все еще будут проблемы, когда фигуры перекрываются, поэтому вам понадобится некоторая концепция оси Z или глубины, чтобы определить, какая фигура находится сверху.

0 голосов
/ 28 февраля 2010

Вам необходимо опубликовать источник для addMouseListeners.

Если вы посмотрите на этот пост здесь, вы можете получить некоторые идеи о том, как могут работать слушатели (если вы разместите источник addMouseListener, мы, конечно, поможем с вашим конкретным вопросом!)

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