2015-03-18 52 views
0

我有一個惱人的問題,試圖調整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(); 

} 

下面是我的鼠標按下和鼠標拖動的方法:

  1. 鼠標按下:

    @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; 
    
    } 
    
    } 
    
  2. 鼠標拖:

    @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(); 

當我這樣做然而,事情停止工作!我仍然可以拖動廣場,但是如果我嘗試調整大小,那麼這個動作是不穩定和極端的。

我做錯了什麼?

+0

也許你應該添加它,而不是從SIZEX/Y – Constant 2015-03-18 21:35:31

+0

減去diffx/Y試過@TylerOsborne,它沒有工作。 – Sam 2015-03-18 21:39:00

回答

1

在我看來,拖動和調整大小的條件並不相互排斥,特別是在邊界附近。假設您在鼠標釋放時將這兩個標記設置爲false,則一次單擊或移動鼠標仍然可以同時進入兩種模式。

我會把else if (mx > x2 - 3 && mx < x2 + 3 && my > y2 - 3 && my < y2 + 3)else if (resizing)以避免任何預期的後果。這將使任何調整優先級的任何拖動。

作爲一個圖形化的東西,很難說如果這是你的問題(或其中的一部分),但給它不能傷害清除這件事。


編輯:當然,你可能想要做大小調整條件優先於(去之前)的阻力情況,由於調整大小的面積比爲拖動區域小得多。


編輯2:順便說一句,當你調整你修改你的square,但不是你的sizexsizey變量。當然,當你拖動時詢問這些值時,它們與之前的一樣(100)。存儲更改,它應該工作。在該說明中,對同一信息進行多次表示可能是一個糟糕的主意。它會導致像這樣的冗餘和同步問題。如果可能的話,刪除這些變量:double x1, y1, x2, y2, sizex, sizey;,然後從當前狀態的正方形讀取/寫入(你可能不需要每次新的正方形)。

+0

我嘗試了你的建議,然後我仍然可以拖動廣場但無法調整大小!我已經恢復,現在調整大小的作品,但廣場仍然跳回到默認大小(100×100),如果我在調整大小後點擊它。有一些方法可以告訴廣場在重新調整大小後保持它的新尺寸,但看起來我認爲這樣做的方式實際上並不奏效! – Sam 2015-03-18 21:49:53

+0

這是預期的行爲。你可能不想同時做這兩件事。那麼,你需要定義拖拽和調整大小的區域。讓我編輯更清晰... – 2015-03-18 21:53:22

+0

好的,我採取了你的意見,並把條件前的調整大小的條件。現在我可以同時拖動和調整正方形,但我仍然有像以前一樣的問題(即,如果我將最後一行保留爲'square = new Rectangle2D.Double(x1,y1,sizex - diffx,sizey - diffy);'那麼當我在調整大小後拖動時,方塊跳回到100 x 100)。 – Sam 2015-03-18 22:00:54

0

我把這些一兩個單獨的函數:

  1. 退房的Component Mover
  2. Component Resizer

在這些類的代碼是更復雜的比你的需要,但你可能要考慮在最終解決方案中分離每個功能的邏輯。

0

我找到了解決辦法,或者說,我找到了a解決方案。我的mouseDragged方法中改變了我的if (resizing)聲明如下:

老:

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(); 

    } 

新:

if (resizing) 
    { 
     double mx = ev.getX(); 
     double my = ev.getY(); 

     x2 = mx - rOffX; 
     y2 = my - rOffX; 

     sizex = x2 - x1; 
     sizey = sizex; 

     square.setRect(x1, y1, sizex, sizey); 
     repaint(); 

    }