2011-12-13 80 views
-1

我有一個JPanel使用BorderLayout它有2個組件。在NORTH中的JLabel和在CENTER中的JListJava - JPanel上的MouseListener未觸發

我已將一個MouseListener添加到面板,並且目前編碼了一個消息框以顯示在mouseEntered上。

問題是隻有當光標進入標籤佔用的區域時才觸發事件。當鼠標進入整個面板區域時,我需要觸發事件。

任何想法我做錯了什麼?

編輯:代碼來創建面板

JPanel p = new JPanel(); 
p.setLayout(new BorderLayout()); 
p.add(new JLabel("Label"), BorderLayout.NORTH); 
p.add(new JList(), BorderLayout.CENTER); 
p.addMouseListener(new MouseListener(){ 
     @Override 
     public void mouseEntered(MouseEvent e) { 
      JOptionPane.showMessageDialog(null, "Entered Panel"); 
     } 
     //Other overriden methods 
     ... 
    }); 
+3

「*讓我知道如果我需要顯示一些代碼。*」。是的,請包括[sscce](http://www.sscce.org)。 – mre

+0

*「創建面板的代碼」*您難以理解SSCCE的哪一部分? –

+0

所以你想要一個完整的程序?你能推薦我如何上傳它下載。 –

回答

2

我認爲問題在於JList的是接收鼠標事件的組件。我不確定這是處理這個問題的最好方法,但是不能將同樣的鼠標監聽器添加到JList中嗎?

0

任何具有MouseListener的組件都將收到鼠標事件,並且它不會傳遞給面板。

您可以爲每個組件添加一個MouseListener,但是如果面板的設計發生變化,該怎麼辦?不要忘記,您的JList右側可能有一個滾動條,所以如果用戶從右側進入面板,則只有在鼠標移過滾動條到列表上時纔會生成事件。

相反,您可能需要考慮使用Global Event Listener來偵聽mouseEntered事件。然後,當收到事件時,您需要檢查事件的來源是面板本身還是面板的子組件。您應該能夠使用:

SwingUtiltities.isDescendingFrom(...) 

幫助進行此項檢查。

4

由於JDK7你可以裝飾用JLayer任何的JComponent和註冊接收層的所有事件分派給其子,像

JTable list = new JTable(30, 5); 
    JComponent panel = new JPanel(new BorderLayout()); 
    panel.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50)); 
    panel.add(new JLabel("we are label")); 
    panel.add(new JScrollPane(list)); 
    LayerUI<JComponent> ui = new LayerUI<JComponent>() { 

     @Override 
     protected void processMouseEvent(MouseEvent e, JLayer<? extends JComponent> l) { 
      if (e.getID() == MouseEvent.MOUSE_ENTERED) { 
       System.out.println(e.getSource().getClass() + " at " + e.getPoint()); 
      } 
     } 
    }; 
    JLayer<JComponent> layer = new JLayer<JComponent>(panel, ui); 
    layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK); 

注意,這是內部由一個AWTEventListener處理,就像解決方案在Rob的博客中提出。與Rob的解決方案相比,它的優勢在於它可以在沙盒環境中工作(因爲核心類JLayer具有必要的權限)。

對於較早的jdk版本,有一個project JXLayer(SwingLabs的一部分),它是新核心類的直接前驅。它沒有權限問題,因爲它在內部使用稍微不同的方法來獲取所有事件。