2009-08-26 72 views
0

我一直試圖創建的效果是,只要鼠標進入JPanel上的某個區域,鼠標光標圖標就會改變,並且在它離開區域時切換爲默認值。我在MouseMotionListener類中使用了MouseMoved功能,只要鼠標移動到JPanel上,就會驗證座標是否對應於特殊區域。如何在Java中高效跟蹤遊標位置?

但是,這種方法在計算機處理器上的壓力非常大,所以我想問一下是否有更高效的方法。任何幫助表示讚賞。

該程序的功能是在JPanel上繪製圖形,當連接按鈕被選中時,如果用戶點擊一個圖形,然後在另一個圖形上,則用線連接這些圖形。

這些圖形繪製在JPanel上,並且存儲了它們各自的區域邊界,因此當鼠標移動時它會檢查當前的X和Y座標是否位於其中一個區域內,如果是,則會更改光標。 checkValidConnectionRegion檢查當前的X和Y變量是否在數字區域內。以下是處理程序的代碼:

public void mouseMoved(MouseEvent e) 
    { 
     if(GUI.Connectionbutton.isSelected()) 
     { 
      x = e.getX(); 
      y = e.getY(); 

      checkValidConnectionRegion(); 

      if(validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
      if(!validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 

回答

2

我不熟悉Java,但問題可能是Cursor.getPredefinedCursor是每次你怎麼稱呼它創建一個新的遊標實例。 (我不知道這是否爲真)

嘗試在兩個遊標中設置兩個final字段並僅設置它們一次。

另外,如果validConnectionRegion實際上發生了變化,請嘗試僅使用光標。

例如:

final Cursor crosshairCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); 
final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 

public void mouseMoved(MouseEvent e) 
{ 
    if(GUI.Connectionbutton.isSelected()) 
    { 
     x = e.getX(); 
     y = e.getY(); 

     boolean wasValid = validConnectionRegion; 
     checkValidConnectionRegion(); 

     if(wasValid != validConnectionRegion) 
      setCursor(validConnectionRegion ? crosshairCursor : defaultCursor); 
    } 
} 
2

您可能在MouseMoved處理程序中運行效率低下的代碼。

你可以發佈MouseMoved處理程序的完整源代碼嗎?

+0

好吧,我將修改的問題和職位的代碼。 – Hans

5

更有效的方法是將子JPanel添加到父JPanel,這將作爲不可見區域。然後,只需將光標置於子項JPanel上,並且在移動鼠標指針時應該更改鼠標指針。

JPanel mainPnl = new JPanel(new BorderLayout()); 

JPanel invisibleArea = new JPanel(); 
invisibleArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
invisibleArea.setPreferredSize(new Dimension(100, 100)); 

mainPnl.add(invisibleArea, BorderLayout.WEST); 
+0

我在想這將是一種方法,但我需要改變數字繪製的整個方式。 – Hans

+0

嗯,或者我仍然可以在主面板上繪製圖形,並且當選擇「連接按鈕」時,將每個不可見區域設置爲可見。 – Hans