Вы можете перетаскивать из компонента, даже из окна, вполне умышленно, чтобы поддерживать перетаскивание.
Для событий перетаскивания вам просто нужно ограничить местоположение события внутри его контейнера:
static public final int MAX_X=(CANVAS_WIDTH - PADDLE_WIDTH);
...
public void mouseDragged(MouseEvent e) {
int px=Math.max(0,Math.min(e.getX(),MAX_X));
int dx=(px-lastX);
if(dx!=0) {
gobj.move(dx);
lastX=px;
}
}
После сна и перечитывания комментариев у меня есть идея, в чем может заключаться проблема - в предоставленном коде GObject не отображается, как и как он создается / инициализируется. Поэтому трудно догадаться о контексте кода в вопросе.
Держу пари, что весло создано изначально в середине (возможно, в середине / внизу) холста. Приведенный выше код и вопрос только ограничивают дельту, чтобы предотвратить превышение дельтой границ холста - она не учитывает начальную позицию весла. То есть, если весло начинается при x = 350, а дельта учитывает в общей сложности 700-150 = 550, то ограниченная дельта позволит веслу переместиться в 350-550 = -200, весло переместится 200 пикселей за левым краем.
Так что вам нужно передать методу перемещения верхние границы и ограничить результирующую позицию 0 <= px <= UPPER ... что-то вроде: </p>
...
if(dx!=0) {
gobj.moveX(dx,MAX_X);
lastX=px;
}
...
GObject:
public void moveX(int dlt, int max) {
positionX=Util.limitInt((positionX+dlt),0,max);
}
Util:
/**
* Limit the range of a number to the specified values.
*/
static public int limitInt(int val, int low, int hgh) {
return ((val<low) ? low : ((val<hgh) ? val : hgh));
}
И я бы повторил весь код для Y и управлял бы этой осью отдельно. В противном случае вам нужно будет расширить ваш метод перемещения до:
public void move(int dltX, int maxX, int dltY, int maxY) {
positionX=Util.limitInt((positionX+dltX),0,maxX);
positionY=Util.limitInt((positionX+dltY),0,maxY);
}