2017-07-03 41 views
1

我正在開發一個帶標籤工具提示的小型擺動應用程序。這個應用程序必須對鼠標事件作出反應,例如點擊或退出框架。
沒有工具提示,該應用程序的行爲正確,但如果我添加工具提示,我不再有鼠標事件。擺動:鼠標事件和工具提示

我寫了一個小例子來解釋我的問題,一個帶3個Jlabels的JFrame。在該中心的一個有一個提示:

package testJtooltip; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.border.Border; 

public class TestToolTip { 
    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     frame.setSize(new Dimension(100,150)); 
     frame.setLocation(100, 100); 
     frame.setUndecorated(true); 
     frame.addMouseListener (
       new MouseListener() { 
        public void mouseClicked(MouseEvent e) {} 
        public void mouseEntered(MouseEvent e) {} 
        public void mouseExited(MouseEvent e) { 
         System.out.println("exited"); 
        } 
        public void mousePressed(MouseEvent e) { 
         System.exit(0); 
        } 
        public void mouseReleased(MouseEvent arg0) {} 
       } 
       ); 


     Border border = BorderFactory.createLineBorder(Color.BLUE, 1); 

     JLabel label1 = new JLabel(); 
     label1.setBorder(border); 
     label1.setText("top"); 
     label1.setPreferredSize(new Dimension(100, 50)); 
     frame.add(label1,BorderLayout.PAGE_START); 

     JLabel label2 = new JLabel(); 
     label2.setBorder(border); 
     label2.setText("center"); 
     label2.setPreferredSize(new Dimension(100, 50)); 
     label2.setToolTipText("tooltip"); 
     frame.add(label2,BorderLayout.CENTER); 

     JLabel label3 = new JLabel(); 
     label3.setBorder(border); 
     label3.setText("bottom"); 
     label3.setPreferredSize(new Dimension(100, 50)); 
     frame.add(label3,BorderLayout.PAGE_END); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

所以,我的問題是:
1)點擊中間的標籤上不退出(同時點擊其他退出)。
2)在中心標籤的左側或右側退出框架時(當事件從其他地方退出時),不會激發mouseExited。
3)從頂部或底部標籤移動到中心時觸發mouseExited事件。

它「似乎」與工具提示的JLabel是「框架外」。

我錯過了什麼?我該如何修復,特別是mouseExited事件?

+0

我相信這裏是你在找什麼:[Tooltip stealing mouse events](https://stackoverflow.com/questions/5305462/tooltip-stealing-mouse-events?rq=1) –

+0

感謝您的迴應,但不,即使我在點擊工具提示之前點擊或者點擊工具提示(但位於中心標籤內),應用程序也不會退出。更多,這不能解決mousExited事件問題... – Carminou

+0

搜索並找到確切的解決方案。請參閱這裏:https://stackoverflow.com/questions/14931323/jlabel-tooltip-interferes-with-mouselistener – Aman

回答

-1

請更新您的代碼與下面給出一段代碼:

frame.addMouseListener(new MouseAdapter() { 
    public void mouseExited(MouseEvent e) { 
     System.out.println("exited"); 
    } 

    public void mousePressed(MouseEvent e) { 
     System.exit(0); 
    } 
}); 

基本上使用的,而不是使用MouseListener的匿名類MouseAdapter匿名類。我用你的代碼一樣,它工作正常。

希望這會有所幫助。 :-)

+0

對不起,我做了修改(MouseAdapted而不是MouseListener),但它並沒有解決任何問題。仍然錯誤的mouseExited事件和中心按鈕上沒有mousePressed事件。 – Carminou

+0

搜索並找到確切的解決方案。請參閱此處:https://stackoverflow.com/questions/14931323/jlabel-tooltip-interferes-with-mouselistener – Aman

0

將事件分派到具有偵聽器的底層組件。

首先,您將一個通用級偵聽器添加到框架。

但是,然後你添加一個工具提示到標籤。工具提示通過向標籤添加監聽器來工作。因此mouseEntered/Exited事件由工具提示監聽器處理。事件不會傳遞給添加到框架的偵聽器。

如果您需要額外的處理,那麼您還需要將自定義MouseListener添加到標籤。

+0

它解決了部分問題。我可以在JLabel級別處理mousePressed,它可以工作。但是關於mouseExited,它不起作用:我現在在離開JFrame(ok)時有mouseExited,而且從3個JLabel中的任何一個移動到另一個JLabel時都有。這是不行的... – Carminou

+0

@Carminou,我沒有完全理解你的需求,所以你要根據你對事件處理的新理解來實現邏輯。您可以創建一個「包裝器」面板,而不是在標籤級別處理mouseEntered/Exited。因此,您將標籤添加到「包裝器」面板並在「包裝器」面板上處理mouseEntered/Exited。也許這個答案會給你一些想法:https://stackoverflow.com/questions/42579137/how-to-avoid-child-gui-objects-to-take-over-mouse-listener/42584044#42584044 – camickr

+0

在現實中,我的應用程序要複雜得多,並且在封閉窗口的一邊有很多帶有工具提示的JLabel。當光標離開窗口時,顯示器應該處於「待機」狀態(比如灰色)。因此,我在外層名望級別編寫了mouseExited處理程序,以便在光標離開窗口時將顯示重置爲標準。但是,如上所示,當光標通過其中一個具有工具提示的JLabel離開窗口時,JFrame在光標離開窗口時不會收到mouseExited事件。 – Carminou

相關問題