我有一個惱人的問題,試圖調整Java中的可拖動正方形。要調整廣場的大小,我正在檢查鼠標光標是否在廣場右下角的矩形區域內 - 如果是,則當我拖動鼠標時,廣場會調整大小。此代碼工作正常,但如果我再點擊廣場上拖動它在屏幕上,它跳回的100×100調整Java中的正方形
默認大小我的班級開始了這樣的:
public class DragPanel extends JPanel implements MouseListener,
MouseMotionListener, MouseWheelListener
{
Graphics2D g2;
Rectangle2D square;
Color colour;
double x1, y1, x2, y2, sizex, sizey;
double offsetX, offsetY;
double oldx, oldy;
boolean dragging = false;
boolean resizing = false;
public DragPanel()
{
x1 = 10.0;
y1 = 10.0;
sizex = 100.0;
sizey = 100.0;
x2 = x1 + sizex;
y2 = y1 + sizey;
square = new Rectangle2D.Double(x1, y1, sizex, sizey);
colour = Color.BLUE;
setFocusable(true);
addMouseListener(this);
addMouseMotionListener(this);
addMouseWheelListener(this);
this.requestFocus();
}
下面是我的鼠標按下和鼠標拖動的方法:
鼠標按下:
@Override public void mousePressed(MouseEvent ev) { double mx = ev.getX(); double my = ev.getY(); if (mx > x1 && mx < x2 && my > y1 && my < y2) { dragging = true; offsetX = mx - x1; offsetY = my - y1; } if (mx > x2 - 3 && mx < x2 + 3 && my > y2 - 3 && my < y2 + 3) { oldx = mx; oldy = my; resizing = true; } }
鼠標拖:
@Override public void mouseDragged(MouseEvent ev) { if (dragging) { double mx = ev.getX(); double my = ev.getY(); x1 = mx - offsetX; y1 = my - offsetY; x2 = x1 + sizex; y2 = y1 + sizey; square = new Rectangle2D.Double(x1, y1, sizex, sizey); repaint(); } if (resizing) { double mx = ev.getX(); double my = ev.getY(); double diffx, diffy; diffx = oldx - mx; diffy = oldy - my; square = new Rectangle2D.Double(x1, y1, sizex - diffx, sizey - diffy); repaint(); } }
你看到上面的代碼做什麼,我希望它在調整方面做,但我已經解釋過,當我嘗試不能正常工作,後拖方大小調整。我知道爲什麼 - 這是因爲該行的:
square = new Rectangle2D.Double(x1, y1, sizex - diffx, sizey - diffy);
所以我的解決辦法是改變if (resizing)
塊的最後部分如下:
diffx = oldx - mx;
diffy = oldy - my;
sizex -= diffx;
sizey -= diffy;
square = new Rectangle2D.Double(x1, y1, sizex, sizey);
repaint();
當我這樣做然而,事情停止工作!我仍然可以拖動廣場,但是如果我嘗試調整大小,那麼這個動作是不穩定和極端的。
我做錯了什麼?
也許你應該添加它,而不是從SIZEX/Y – Constant 2015-03-18 21:35:31
減去diffx/Y試過@TylerOsborne,它沒有工作。 – Sam 2015-03-18 21:39:00