2017-07-03 5 views
1

私は、ラベル上にツールチップを含む小さなSwingアプリケーションを開発しています。このアプリは、クリックやフレームの終了などのマウスイベントに反応する必要があります。
ツールチップがないとアプリは正しく動作しますが、ツールチップを追加するとマウスイベントがなくなります。スイング:マウスイベントとツールチップ

私は私の問題を説明するために小さな例を書いた、3つのJlabelsを持つJFrame。センター内の1つのツールヒントがあります:

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

申し訳ありませんが、私は修正(MouseListenerの代わりにMouseAdapted)しましたが、何も解決しません。それでも間違った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に移動するときもあります。そしてそれはOKではありません... – 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の1つを介してウィンドウを離れると、JFrameはカーソルがウィンドウを離れるときにmouseExitedイベントを受け取りません。 – Carminou