Трудность понимания Java MouseEvent - PullRequest
1 голос
/ 01 марта 2010

Я занимаюсь этими уроками iTunes в Стэнфорде и начинаю изучать Java. Все идет хорошо, но недавно они представили события, в частности MouseEvents. Я читал главы в книге и пролистывал пример кода, и что-то просто не подходит мне ... это всегда та асинхронная вещь, которая доставляет мне проблемы: -D

Ранее некоторые люди упоминали, что важно упомянуть, что addMouseListener - это класс в импорте графики. Насколько я могу судить, это просто добавляет слушателя общей мыши к холсту.

Я все еще новичок в этом, поэтому я могу описывать вещи не так хорошо, как следовало бы.

Это фрагмент кода, который я пытался упростить, чтобы лучше его понять. В настоящее время он построит красный прямоугольник, и я могу щелкнуть по нему и перетащить его вдоль оси x. Отлично !!!

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

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

public class DragObject extends GraphicsProgram {

    /* Build a rectangle  */
    public void run() {

        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((lastX) > 100){
            gobj.move(e.getX() - lastX, 0);

            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 */
}

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

Я пытался что-то в этом роде, но это не работает правильно:

    if  ( ( lastX > (getWidth() - PADDLE_WIDTH) ) || ( lastX < PADDLE_WIDTH ) ) {
        gobj.move(0, 0);
    } else {
        gobj.move(e.getX() - lastX, 0);
    }

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

Ваш код перемещает прямоугольник относительно последней позиции мыши. Это прекрасно работает, когда вы просто перемещаете вещи, но для ваших нужд, когда вы хотите, чтобы они остановились на границах, вам нужно использовать абсолютное позиционирование.

// When the mouse is pressed, calculate the offset between the mouse and the rectangle
public void mousePressed(MouseEvent e) {
    lastX = e.getX();
    lastY = e.getY();
    gobj = getElementAt(lastX, lastY);
}

public void mouseDragged(MouseEvent e) { 
        double newX;

        // Assuming you can get the absolute X position of the object.
        newX = gobj.getX() + e.getX() - lastX;
        // Limit the range to fall within your canvas. Adjust for your paddle width as necessary.
        newX = Math.max( 0, Math.min( newX, getWidth() ) );
        // Set the new position of the paddle, assuming you can set the absolute position.
        gobj.setX( newX );

        lastX = e.getX();
        lastY = e.getY();
    }
}

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

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

0 голосов
/ 01 марта 2010

Чтобы сделать это, вам нужно знать ширину объекта Canvas, я уверен, что будет метод, который предоставит это значение. Затем вы можете проверить текущее положение x MouseEvent по ширине холста и не увеличивать координаты x объекта формы, когда вы пройдете ширину холста. В зависимости от того, сколько фигуры вы хотите оставить на холсте, вам также может понадобиться учитывать ширину объекта фигуры.

Одна вещь, которая помогает мне при работе с анимацией и перемещением объектов в графическом интерфейсе, - это нарисовать несколько сценариев на бумаге и заметить, как меняются координаты.

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