2012-03-20 143 views
2

此問題的解決方案是什麼?Java JPanel鼠標監聽器無法在其組件上工作

我在JPanel中添加了一個鼠標監聽器,但該面板中充滿了覆蓋JPanel整個區域的按鈕。

實施例(僞)代碼:

Create JPanel 
Set to GridLayout 
Add 25 buttons (5x5 grid) 
Add MouseListener to JPanel 

的MouseListener /的MouseMotionListener:

onMouseMove { print out X,Y co-ords of mouse } 

共ORDS從不打印出來,直到我得到正確的JPanel的容器的邊緣,這是因爲按鈕阻塞了其餘部分。

如何讓鼠標偵聽器可以在所有面板組件上工作,而無需將偵聽器添加到每個組件?或者我應該將偵聽器添加到每個組件?

附加信息: 我正在嘗試爲觸摸屏系統添加觸摸手勢(滑動面板會導致發生操作)。 我對自己認識手勢非常有信心,但是我真的希望找到一種「更好」的方式,而不是將偵聽器的副本添加到每個組件(對我來說,這會更糟糕,因爲組件正在更改)。

我會嘗試將其添加到的glassPane,而不是...(目前中的getRootPane()給我的NullPointerException)

編輯: 我現在知道,我想中的getRootPane( )從JPanel這不是根容器,這就是爲什麼我得到一個null。我需要在主JFrame上執行此操作。

EDIT2: 好了,所以我已經做了(加玻璃板主JFrame的),首先我有一個問題,因爲我沒有做到這一點:

myGlassPane.setVisible(true);

所以似乎它不起作用。但是,一旦我做了所有我需要做的就是設置不透明標誌設置爲false,使其透明

myGlassPane.setOpaque(false);

所以,現在我得到的X,Y共同ORDS打印出來,在按鈕和一切,但是按鈕不起作用,因爲它們上面有一個面板。

+0

您可能不得不使用glasspane截取鼠標,然後讓它將鼠標事件分派給下面的所有基礎組件。 – 2012-03-20 20:57:03

+0

不要爲按鈕使用'MouseListener'!一個'ActionListener'將響應鼠標和鍵盤的輸入。 – 2012-03-20 21:05:25

+0

嗨皮特:D。當我嘗試'myPanel.getRootPane()時,我無法繞過'NullPointerException' ...'當我試圖去玻璃板。 – Ozzy 2012-03-20 21:10:51

回答

1

用自定義按鈕替換JButton。將您需要的事件從按鈕轉發到按鈕的父級。這是一個將轉發鼠標輸入事件的示例。調整轉發並根據需要添加異常/錯誤處理。

class JJButton extends JButton { 
    { 
     addMouseListener(new MouseAdapter(){ 
     public void mouseEntered(MouseEvent e) { 
      if (JJButton.this.getParent()!=null){ 
       MouseListener[] ml = JJButton.this.getParent().getMouseListeners(); 
       for (MouseListener l : ml) { 
        l.mouseEntered(e); 
       } 
      } 
     } 
     }); 
    } 
    public JJButton(String string) { 
     super(string); 
    }  
} 
+0

如果我沒有終於通過玻璃窗看到我的活動,我會這樣做,所以我接受這個問題作爲這個問題的答案。謝謝。 – Ozzy 2012-03-22 01:26:28

+0

這就是我現在所做的 - 在找出長時間/困難的方式後,我無法讓我的Java應用程序允許MouseListener事件與超過1層一起工作。再次感謝@ChuckFricano。 – Ozzy 2012-03-22 15:20:30

2

將您的監聽器添加到面板和傳感按鈕。

+0

那麼正常的會議@Snicolas? – Ozzy 2012-03-20 21:23:07

+1

完全不是,但是你在尋找的東西既不是正常的約定。 :) – Snicolas 2012-03-21 05:48:02

+0

但請確保分享聽衆可以是一種常見的做法。也許更多的分享行動。無論如何,比刪除重複代碼好得多。 – Snicolas 2012-03-21 14:38:43