Я занимаюсь этими уроками 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);
}