2011-03-25 10 views
1

我有一個JPanel(讓我們叫它ctrlPanel),並使用空佈局,我已經放置在它的背景JLabel。在這個標籤的頂部,我有另一個JLabel和一個JButton(默認情況下隱藏)。當用戶用鼠標懸停在ctrlPanel上時,我想顯示該標籤和按鈕。當面板上的JButton懸停時,JPanel上的MouseExited會運行嗎?

它通過向ctrlPanel添加mouseAdapter以及在鼠標輸入時調用showControls()以及在mouseExited時調用hideControls()來工作(幾乎)。這些使用setVisible來顯示/隱藏頂部的組件。但是,當用戶將鼠標懸停在JButton上時,ctrlPanel似乎會得到一個mouseExited調用,這會使JButton「閃爍」(mouseExited-> mouseEntered-> mouseExited等等)。這對我來說沒有任何意義,因爲JButton的 ctrlPanel中。我的意思是,當懸停在JLabel上時沒有問題。

+2

爲了更快獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。爲了理智,避免空佈局。 – 2011-03-25 17:44:45

回答

1

我不認爲你想要的是可行的 - 內部控制攔截鼠標事件。所以,你可以

  • 創建一個鼠標偵聽器並將其連接到面板,按鈕等,並妥善處理處處
  • 檢查的東西在的mouseExited()座標,如果鼠標仍然在面板內部,忽略那個事件
0

我也測試過了,驚訝地發現了相同的結果。我猜Java的組件不像JavaScript和HTML那樣處理鼠標移入和移出事件(通過事件冒泡)。使用不同的佈局管理器沒有任何影響。

我認爲這是處理這個問題最安全的方法:創建一個自定義JPanel類覆蓋add()方法。這代表super.add(),但也會將其自定義鼠標偵聽器添加到傳入的每個組件。這樣,您仍然可以獲得鼠標輸入和鼠標退出事件,但是您將能夠跟蹤面板內的元素。無論您在鼠標離開面板時執行的操作只會非常短暫,只要下一個事件觸發就立即撤消。您不應該看到GUI的任何可見更改,但是如果看到閃爍,請嘗試使窗口雙緩衝。

1

我的確在ixula的回答來處理這個問題,因爲什麼:

「檢查時的mouseExited()座標,如果鼠標仍然在面板內部,忽略事件」

public void mouseExited(MouseEvent e) { 
    if(stillInPanel(e.getPoint())) return; 
    // Exit logic 
} 

private boolean stillInPanel(Point2D p) { 
    return (YOURJPANEL.contains((Point)p)); 
} 

凡YOURJPANEL可以是任何容器。

相關問題